从XML中选择特定元素

时间:2013-06-09 20:00:38

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

我有以下XML结构

<books>
   <crime>
      <crime_book title="abc" />
      <crime_book title="def" />
   </crime>
   <vacation>
      <vacation_book title="ghi" />
   </vacation>
   <drama />
</books>

如何将所有图书放在一个列表中?

我有

var doc = XDocument.Load("filename");
var query = from element in doc.Root.Elements()
            select element;

但这只给了我书的类型。我想跳过那个级别。

5 个答案:

答案 0 :(得分:4)

简单,

var query = doc.Descendants("book");

修改

要获得所有级别的书

var query = xDoc.Descendants()
            .Where(d => d.Name.LocalName.EndsWith("_book"));

var query = xDoc.Descendants()
            .Where(d => d.Parent != null)
            .Where(d => d.Name.LocalName == d.Parent.Name.LocalName + "_book");

答案 1 :(得分:2)

Enumerable.SelectMany

doc.Root.Elements().SelectMany(n => n.Elements());

基本上与Select相同,但它会使序列变平一层。

答案 2 :(得分:1)

如何使用XPath?假设只有书籍具有属性title

var query = doc.XPathSelectElements("//*[@title]");

答案 3 :(得分:0)

我猜你想要一个标题列表,所以这会把它们放在IEnumerable<XAttribute>中:

var titleAttributes = doc.Descendants().SelectMany(e => e.Attributes("title"));

无论具有title属性的嵌套元素如何,并且根据您对其他答案的评论,无论元素名称在不同级别上有所不同,都可以工作。

答案 4 :(得分:0)

另一个班轮选项是检查标题属性

var result = doc.Descendants().Where(x=>x.Attribute("title") != null);