LINQ到XML选择子元素 [英] LINQ to XML Selecting Child Elements
问题描述
我试图从一个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屋!