LINQ到XML选择子元素 [英] LINQ to XML Selecting Child Elements

查看:183
本文介绍了LINQ到XML选择子元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从一个XML文件中的信息将使用LINQ to XML的对象。虽然我可以返回文档和部分编号属性我无法访问项目的每个部分元素,它返回一个IEnumerable文档中的所有项目。我知道这是正确的,因为我打电话给后代,但我在努力让它只返回每个部分元素的子项。任何人可以帮助?



XML文档



<预类=郎咸平的XML prettyprint-覆盖> <根和GT;
<文件编号=1>
<节ID =1.1>
<项目ID =1.1.1>< /项目>
<项目ID =1.1.2>< /项目>
<项目ID =1.1.3>< /项目>
< /节>
<节ID =1.2>
<项目ID =1.2.1>< /项目>
<项目ID =1.2.2>< /项目>
< /节>
< /文件>
< /根>



LINQ查询



 的XElement的DocumentRoot = XElement.Load(document.xml); 
VAR文件=(从documentRoot.Descendants(文件)
选择新的
文档{
n =(字符串)docs.Attribute(ID),
节= docs.Elements(部分),
项= docs.Elements(部分)元素(项目)
})了ToList()。

的foreach(在文件VAR DOC)
{
的foreach(在doc.Sections VAR部分)
{
Console.WriteLine(SectionId: + section.Attribute(ID));
的foreach(在doc.Items VAR项)
{
Console.WriteLine(ITEMID:+ section.Attribute(ID));
}
}
}


解决方案

您得到了一些小的错别字,在属性编号,并在项目环。但是,如果你想获得的所有部分物品进入的项目集合,你错在设计水平,为项目应该是属性,而不是文件(所以你需要查询您的XML两次)。



或者,你可以做一些事情,如:

  VAR文件= 
(从文档中documentRoot.Descendants(文件)
选择新的
{
n =(字符串)docs.Attribute(ID),
节= docs.Elements(部)
})了ToList()。

的foreach(在文件VAR DOC)
{
的foreach(在doc.Sections VAR部分)
{
Console.WriteLine(SectionId: + section.Attribute(ID));
的foreach(在section.Elements(VAR项项目))
{
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


I am trying to extract information from an XML file into an object using LINQ to XML. Although I can return the document and section Id attributes I cannot get access to the Items for each section element, it returns an IEnumerable of all the items in the document. I know this is correct as I’m calling Descendants but am struggling to get it to return only the child items of each section element. Can anybody help?

XML Document

<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 Query

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

解决方案

You got some small typos, on attribute Id and at item loop. But if you're trying to get all section items into that items collection, you're wrong at design level, as Items should be a Section property, not Document (so you'll need to query your XML twice).

Or, you can to do something like:

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

Output:

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"

这篇关于LINQ到XML选择子元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆