我有以下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;
但这只给了我书的类型。我想跳过那个级别。
答案 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);