2010-11-06 170 views
1

这个查询不工作,因为我期待它。任何人都看到了问题?需要一些XElement查询的帮助

我试图通过它的名称获取元素,但它没有返回任何东西。下面是函数的具体一部分,我需要一些帮助:

alt text


更新

的解决方案是使用的XName而不是字符串。像这样:

var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name))); 

回答

3

试着改变你的线路:

elements.Where(e => e.Name.LocalName == name) 

LocalName部分是重要的组成部分,否则你是一个比较stringXName的平等。请记住,XML支持样式“prefix:element-name”的名称。在该例子中,“前缀”是与由e.Name.Namespace返回的命名空间相关联的标识符,并且“元素名称”是由e.Name.LocalName返回的标识符。

+0

有趣 - 我有一种感觉,它可能与名称空间有关,我会进一步调查。谢谢。 – 2010-11-06 20:38:19

1

我认为您需要将根名称空间添加到元素的名称。 您也可以尝试使用XContainer.Descendants(XName)方法。

2

Kirk's answer是对的钱。我想指出你的代码有几个问题。

此行不必要计算的所有元素:

var hasMatch = matchingElements.Count() > 0; 

你可以用Any()更换一次找到一个元素时,将提前终止:

var hasMatch = matchingElements.Any(); 

接下来,在核实hasMatchtrue您应该致电First()而不是FirstOrDefault(),因为您知道它必须具有此时的价值。

说了这么多,你实际上可以重写代码如下:

var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name); 
return (string)matchingElement; 

这里强制转换为string将返回如果它被发现的元素的值,否则将返回null。演员阵容仅用于null,因为如果没有找到元素,您将无法使用matchingElement.Value,这将抛出NullReferenceException。如果您期望只有一个元素存在,您还应该考虑使用SingleOrDefault

+0

感谢您的评论!我不知道.Any函数的优点。我很感激你花时间教这些优化。 – 2010-11-06 21:05:21