我对LINQ并不陌生,但这似乎很简单。
我有一个XML文档,其中包含这样的结构:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<folders>
<folder id="-1" parent="-100">
<name><![CDATA[Root]]></name>
<children>
<folder id="2" parent="-1">
<name><![CDATA[Contribution]]></name>
<documents />
<children>
<folder id="775" parent="2">
<name><![CDATA[category1]]></name>
<documents />
<children>
<folder id="2319" parent="775">
<name><![CDATA[Acad_Depts1]]></name>
<documents />
<children>
<folder id="26965" parent="2319">
<name><![CDATA[Student1]]></name>
<documents>
<document>
</document>
</documents>
</folder
</children>
</folder>
<folder id="2319" parent="775">
<name><![CDATA[Acad_Depts2]]></name>
<documents />
<children>
<folder id="26965" parent="2319">
<name><![CDATA[Student1]]></name>
<documents>
<document>
</document>
</documents>
</folder
</children>
</folder>
etc...
</children>
</folder>
</children>
</folder>
</children>
</folder>
</folders>
我想做的是选择所有具有'parent =“ 775”'属性的元素。
XElement xelement = XElement.Load("folders_only_registrar_folder.xml");
IEnumerable <XElement> folders = xelement.Elements();
var query = from node in folders.Descendants("folder")
where node.Attribute("parent").Value == registrarNodeID
select node;
Console.WriteLine(query.Count());
Console.ReadKey();
foreach(XElement departmentNode in query.Descendants("name"))
{
Console.WriteLine(departmentNode.Value.ToString());
}
当我运行查询并测试计数时,我得到48个结果(很好)...但是当我尝试写出这些相同的节点时,我得到了数百个结果。由于某种原因,它给了我几乎所有名为“文件夹”的元素,包括子文件夹。
关于我做错了什么?
更新...好吧,现在我知道为什么我要得到所有文件夹了,但是对如何创建节点和子节点的每个分组的集合有任何想法吗?
LINQ中的选择是否可以将每个775文件夹节点(加上它的集合子节点)发送到某种类型的节点集合中,然后我可以通过对节点进行分组在foreach中对它们进行解析?
答案 0 :(得分:3)
仅用query.Descendants()
替换query
。 query.Descendants()
获取最初包含在query
中的每个节点的每个子节点。