1

我有以下 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;

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

4

5 回答 5

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");
于 2013-06-09T20:05:22.430 回答
2

Enumerable.SelectMany

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

与 基本相同Select,但它将序列扁平化了一层。

于 2013-06-09T20:05:17.230 回答
1

使用 XPath 怎么样?假设只有书籍有属性title

var query = doc.XPathSelectElements("//*[@title]");
于 2013-06-09T20:25:17.937 回答
0

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

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

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

于 2013-06-09T20:22:34.153 回答
0

另一种衬线选项是检查标题属性

var result = doc.Descendants().Where(x=>x.Attribute("title") != null);
于 2013-06-09T20:26:42.703 回答