需要一些XElement查询的帮助

时间:2010-11-06 20:17:49

标签: c# .net xml xelement

此查询无效,因为我期待它。有人看到问题吗?

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

alt text


更新

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

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

3 个答案:

答案 0 :(得分:3)

尝试将您的行更改为:

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

LocalName部分是重要部分,否则您要比较XNamestring的相等性。请记住,XML支持样式“prefix:element-name”的名称。在该示例中,“prefix”是与e.Name.Namespace返回的命名空间关联的标识符,“element-name”是e.Name.LocalName返回的标识符。

答案 1 :(得分: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

答案 2 :(得分:1)

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