如何以编程方式确定XML节点是否为叶节点?

时间:2013-04-21 17:37:40

标签: c# 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" />
      ...

我想遍历所有节点以填充控件,并且在执行此操作时,请检查:此节点是否为父节点?最简单的方法是什么?

3 个答案:

答案 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);
}