c# - LINQ to XML 选择子元素

标签 c# linq-to-xml

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

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>

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"));
        }
    }
}

最佳答案

您在属性 Id 和项目循环中有一些小错别字。但是,如果您试图将所有部分项目放入该项目集合中,那么您在设计级别就错了,因为 Items 应该是 Section 属性,而不是 文档(因此您需要查询 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"));
        }
    }
}

输出:

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"

关于c# - LINQ to XML 选择子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089799/

相关文章:

c# - 如何学习 LINQ 中的查询

带点符号的 C# 方法实现

c# - 如何在不知道使用 Linq to XML 嵌套多深的情况下查找元素?

c# - 当子节点存在时,LINQ Xelement 返回 null

C# 捕获主窗体键盘事件

xml - 由于 xml 命名空间导致的 LINQ to XML 问题

c# - 需要帮助在 C# 中读取 xml 文件

c# - 编辑 Xml 文件时 SelectSingleNode 不工作

c# - 将参数传递给 EventHandler 中的方法

c# - 如何使用 Windows 窗体应用程序获取文本框中的文件路径?