这个查询没有像我期望的那样工作。有人看到问题了吗?
我试图通过它的名字来获取一个元素,但它没有返回任何东西。这是我需要一些帮助的功能的特定部分:
更新
解决方案是使用 XName 而不是字符串。像这样:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
尝试将您的线路更改为:
elements.Where(e => e.Name.LocalName == name)
该LocalName
部分是重要部分,否则您将比较XName
a 与 a 的相等性string
。请记住,XML 支持“prefix:element-name”样式的名称。在该示例中,“prefix”是与返回的命名空间相关联的标识符e.Name.Namespace
,“element-name”是返回的标识符e.Name.LocalName
。
柯克的回答是对的。我想指出您的代码的一些问题。
此行不必要地计算所有元素:
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;
如果找到,则转换为 astring
将返回元素的值,否则将返回null
。使用强制转换以防万一,因为如果没有找到元素,null
您将无法使用matchingElement.Value
which 会抛出 a 。如果您希望只存在一个元素,NullReferenceException
您还应该考虑使用。SingleOrDefault
我认为您需要将根名称空间添加到元素的名称中。您也可以尝试使用该XContainer.Descendants(XName)
方法。