3

我有一个大的 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" />
      ...

我想遍历所有节点以填充控件,并在这样做时检查:此节点是父节点的传单吗?最简单的方法是什么?

4

3 回答 3

6

叶节点是没有子节点的节点,因此您可以简单地检查它是否有子节点。根据您加载 XML 文档的方式,有多种方法可以执行此操作。例如,您可以使用HasChildNodes属性。

if (myXmlNode.HasChildNodes) 
    //is not a leaf  
else 
    //is a leaf
于 2013-04-21T17:43:37.960 回答
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("./*");
于 2013-04-21T17:41:25.160 回答
0

我将首先flatten使用层次结构 - 例如使用这篇文章中的代码
如何使用 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);
}
于 2013-04-21T18:39:37.977 回答