我有一个如下所示的大型XML树:
<CategoryArray>
<Category Name="Antiques" ID="20081">
<Category Name="Antiquities" ID="37903">
<Category Name="The Americas" ID="37908" />
<Category Name="Byzantine" ID="162922" />
<Category Name="Celtic" ID="162923" />
<Category Name="Egyptian" ID="37905" />
...
我想遍历所有节点以填充控件,并且在执行此操作时,请检查:此节点是否为父节点?最简单的方法是什么?
答案 0 :(得分:6)
叶子节点是没有子节点的节点,因此您只需执行检查是否有子节点。根据您加载XML文档的方式,有多种方法可以执行此操作。例如,您可以使用HasChildNodes属性。
if (myXmlNode.HasChildNodes)
//is not a leaf
else
//is a leaf
答案 1 :(得分:4)
子节点数量会给你答案 - 0个子节点(或者只有文本子节点,取决于你使用的类/查询)意味着它是叶子。
即。 XElement示例表单MSDN:Find a List of Child Elements
XDocument cpo = XDocument.Load("PurchaseOrders.xml");
XElement po = cpo.Root.Element("PurchaseOrder").Element("Address");
// list1 contains all children of PurchaseOrder using LINQ to XML query
IEnumerable<XElement> list1 = po.Elements();
// list2 contains all children of PurchaseOrder using XPath expression
IEnumerable<XElement> list2 = po.XPathSelectElements("./*");
答案 2 :(得分:0)
我首先flatten
层次结构 - 例如使用此帖子中的代码
How do I select recursive nested entities using LINQ to Entity
然后是这样的......
using (XmlReader reader = XmlReader.Create(new StringReader(this.XML)))
{
XElement xml = XElement.Load(reader);
var all = xml.Elements("Category").Flatten(x => x.Elements("Category"));
var leafs = from cat in all
where cat.Elements("Category").Any() == false
select cat;
// or go through all...
var categories =
from cat in all
select new
{
Name = cat.Attribute("Name"),
ID = cat.Attribute("ID"),
IsLeaf = cat.Elements("Category").Any() == false,
SubCount = cat.Elements("Category").Count(),
// Subs = cat.Elements("Category").Select(x => x.Attribute("Name").ToString()).ToArray(),
};
// or put into dictionary etc.
var hash = categories.ToDictionary(x => x.Name);
}