1

这个查询没有像我期望的那样工作。有人看到问题了吗?

我试图通过它的名字来获取一个元素,但它没有返回任何东西。这是我需要一些帮助的功能的特定部分:

替代文字


更新

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

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

3 回答 3

3

尝试将您的线路更改为:

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

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

于 2010-11-06T20:32:41.137 回答
2

柯克的回答是对的。我想指出您的代码的一些问题。

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

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;

如果找到,则转换为 astring将返回元素的值,否则将返回null。使用强制转换以防万一,因为如果没有找到元素,null您将无法使用matchingElement.Valuewhich 会抛出 a 。如果您希望只存在一个元素,NullReferenceException您还应该考虑使用。SingleOrDefault

于 2010-11-06T20:54:41.203 回答
1

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

于 2010-11-06T20:23:51.953 回答