LINQ to XML选择子元素

Cra*_*gly 5 c# linq-to-xml

我试图使用LINQ to XML将XML文件中的信息提取到对象中.虽然我可以返回文档和部分Id属性,但我无法访问每个section元素的Items,它返回文档中所有项目的IEnumerable.我知道这是正确的,因为我正在调用后代,但我很难让它只返回每个section元素的子项.有人可以帮忙吗?

XML文档

<root>
<document id="1">
  <section id="1.1">
    <item id="1.1.1"></item>
    <item id="1.1.2"></item>
    <item id="1.1.3"></item>
  </section>
  <section id="1.2">
    <item id="1.2.1"></item>
    <item id="1.2.2"></item>
  </section>
</document>
</root>
Run Code Online (Sandbox Code Playgroud)

LINQ查询

XElement documentRoot = XElement.Load("document.xml");
var documents = (from docs in documentRoot.Descendants("document")
                 select new
                    {
                        Id = (string) docs.Attribute("id"),
                        Sections = docs.Elements("section"),
                        Items = docs.Elements("section").Elements("item")
                    }).ToList();

foreach(var doc in documents)
{
    foreach(var section in doc.Sections)
    {
        Console.WriteLine("SectionId: " + section.Attribute("Id"));  
        foreach(var item in doc.Items)
        {
            Console.WriteLine("ItemId: " + section.Attribute("Id"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rub*_*ias 7

你在属性Id和项目循环上有一些小的拼写错误.但是如果你试图将所有部分项目都放到该项目集合中,那么你在设计层面上是错误的,因为它Items应该是一个Section属性,而不是Document(所以你需要两次查询你的XML).

或者,您可以执行以下操作:

var documents =
    (from docs in documentRoot.Descendants("document")
     select new
     {
         Id = (string) docs.Attribute("id"),
         Sections = docs.Elements("section")
     }).ToList();

foreach (var doc in documents)
{
    foreach (var section in doc.Sections)
    {
        Console.WriteLine("SectionId: " + section.Attribute("id"));
        foreach (var item in section.Elements("item"))
        {
            Console.WriteLine("ItemId: " + item.Attribute("id"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

SectionId: id="1.1"
ItemId: id="1.1.1"
ItemId: id="1.1.2"
ItemId: id="1.1.3"
SectionId: id="1.2"
ItemId: id="1.2.1"
ItemId: id="1.2.2"