此查询无效,因为我期待它。有人看到问题吗?
我正试图通过它的名字来获取一个元素,但它没有返回任何东西。以下是我需要帮助的函数的具体部分:
更新
解决方案是使用XName而不是字符串。像这样:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
答案 0 :(得分:3)
尝试将您的行更改为:
elements.Where(e => e.Name.LocalName == name)
LocalName
部分是重要部分,否则您要比较XName
与string
的相等性。请记住,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();
接下来,在确认hasMatch
为true
后,您应该致电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)
方法。