LINQ to XML - 尝试按属性值选择元素列表

时间:2010-11-11 21:25:08

标签: c# xml linq linq-to-xml

我正在尝试从XML文档中获取元素列表,其中节点具有特定的属性值。该文档的结构如下:

<root>
  <node type="type1">some text</node>
  <node type="type2">some other text</node>
  <node type="type1">some more text</node>
  <node type="type2">even more text</node>
</root>

我想要的结果是IEnumerable<XElement>包含type =“type1”的两个节点,例如。

  <node type="type1">some text</node>
  <node type="type1">some more text</node>

我正在使用var doc = XDocument.Load(@"C:\document.xml");

加载文档

我可以使用

获取包含我想要的节点的属性的IEnumerable<XAttribute>
var foo = doc.Descendants("node")
    .Attributes("type")
    .Where(x => x.Value == "type1")
    .ToList();

但是,如果我尝试使用下面的代码获取包含这些属性的元素,则会出现Object reference not set to an instance of an object.错误。我使用的代码是

var bar = doc.Descendants("node")
    .Where(x => x.Attribute("type").Value == "type1")
    .ToList();

任何帮助,找出为什么我没有得到我期望的结果将不胜感激。

3 个答案:

答案 0 :(得分:3)

如果节点缺少该属性,则可能发生这种情况。尝试:

 var bar = doc.Descendants("node")
    .Where(x => (string)x.Attribute("type") == "type1")
    .ToList();

答案 1 :(得分:1)

var bar = doc.Descendants("node")
.Where(x => x.Attribute("type") != null && x.Attribute("type").Value == "type1")
.ToList();

为空值添加保护可以解决您的问题。

答案 2 :(得分:0)

var bar = doc.Descendants() //Checking all the nodes, not just the "node"
.Where(x => x.Attribute("type")?.Value == "type1")//if the attribute "type" is not null, check the Value == "type1",  
.ToList();//immediately executes the query and returns a List<XElement> by the value of attribute "type"

如果您需要在文档/元素的所有节点中检查特定属性的值,则可以使用此选项。