2013-04-21 67 views
3

我有这样一个大的XML树如下:如何以编程方式确定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" /> 
     ... 

我想通过所有节点进行迭代来填充控制,这样做的时候,请检查:是这个节点的一个leaft父节点?什么是最简单的方法来做到这一点?

+2

要小心 - 文本节点的节点,太。如果您正在解析的文档恰好指定了xml:space =“preserve”,那么您的“叶子”节点的概念可能会发生变化。看起来你真的在具有子元素(或不)的元素之后,这在技术上与具有子节点(或不)的节点是不同的概念。 – lesscode 2013-04-21 18:22:30

回答

4

子节点的数量会给你答案 - 0个子节点(或只有文本子节点,取决于你使用的类/查询)意味着它是叶。

I.e.的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("./*"); 
5

叶节点是一个没有孩子的,所以你可以简单地进行检查,如果有孩子。根据您如何加载XML文档,有多种方法来完成此操作。例如,您可以使用HasChildNodes属性。

if (myXmlNode.HasChildNodes) 
    //is not a leaf 
else 
    //is a leaf 
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); 
} 
相关问题