需要一些XElement查询的帮助
这个查询不工作,因为我期待它。任何人都看到了问题?需要一些XElement查询的帮助
我试图通过它的名称获取元素,但它没有返回任何东西。下面是函数的具体一部分,我需要一些帮助:
更新
的解决方案是使用的XName而不是字符串。像这样:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
试着改变你的线路:
elements.Where(e => e.Name.LocalName == name)
的LocalName
部分是重要的组成部分,否则你是一个比较string
的XName
的平等。请记住,XML支持样式“prefix:element-name”的名称。在该例子中,“前缀”是与由e.Name.Namespace
返回的命名空间相关联的标识符,并且“元素名称”是由e.Name.LocalName
返回的标识符。
我认为您需要将根名称空间添加到元素的名称。 您也可以尝试使用XContainer.Descendants(XName)
方法。
Kirk's answer是对的钱。我想指出你的代码有几个问题。
此行不必要计算的所有元素:
var hasMatch = matchingElements.Count() > 0;
你可以用Any()
更换一次找到一个元素时,将提前终止:
var hasMatch = matchingElements.Any();
接下来,在核实hasMatch
是true
您应该致电First()
而不是FirstOrDefault()
,因为您知道它必须具有此时的价值。
说了这么多,你实际上可以重写代码如下:
var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name);
return (string)matchingElement;
这里强制转换为string
将返回如果它被发现的元素的值,否则将返回null
。演员阵容仅用于null
,因为如果没有找到元素,您将无法使用matchingElement.Value
,这将抛出NullReferenceException
。如果您期望只有一个元素存在,您还应该考虑使用SingleOrDefault
。
感谢您的评论!我不知道.Any函数的优点。我很感激你花时间教这些优化。 – 2010-11-06 21:05:21
有趣 - 我有一种感觉,它可能与名称空间有关,我会进一步调查。谢谢。 – 2010-11-06 20:38:19