2013-04-21 81 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); 
} 
相關問題