代码之家  ›  专栏  ›  技术社区  ›  Cragly

Linq to XML选择子元素

  •  5
  • Cragly  · 技术社区  · 16 年前

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

    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"));
            }
        }
    }
    
    2 回复  |  直到 10 年前
        1
  •  7
  •   Rubens Farias    16 年前

    你有一些小的打字错误 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"));
            }
        }
    }
    

    输出:

    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"
    
        2
  •  2
  •   bluish dmajkic    13 年前

    你想要平的结构吗?!?!(来自LinqPad)

    XElement documentRoot  = XElement.Parse (
    @"<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> 
    ");
    
    
    
    
    var documents = (from docs in documentRoot.Descendants("section") 
                     select new 
                        { 
                            SectionId = (string) docs.Attribute("id"), 
                            Items = docs.Elements("item") 
                        }); 
     documents.Dump();
    

    这给出了2 SectionId 包含的项目 XElement 与相关项目。

    推荐文章