2017-07-28 122 views
3

這是我的XML結構:如何獲取c#xmlReader中XML節點子項的數量?

<classes> 
    <Base Name="node1"> 
     <Book Name="child01" CoverArtName="C102.jpg" CoverBaseFolder="" Tooltip="" PluginBook=""/> 
     <Book Name="child02" CoverArtName="C102.jpg" CoverBaseFolder="" Tooltip="" PluginBook=""/> 
     <Book Name="child03" CoverArtName="C102.jpg" CoverBaseFolder="" Tooltip="" PluginBook=""/> 
    </Base > 
    <Base Name="node2"> 
     <Book Name="child01" CoverArtName="C102.jpg" CoverBaseFolder="" Tooltip="" PluginBook=""/> 
     <Book Name="child02" CoverArtName="C102.jpg" CoverBaseFolder="" Tooltip="" PluginBook=""/> 
    </Base > 
    <Base Name="node3"> 
    </Base > 
</classes> 

我怎麼可以得到的XmlReader每個節點的孩子的數量?

更新: 我讀我的XML與THES代碼:

列表base7 =新名單();

XmlReader xmlReader = XmlReader.Create("Books.xml"); 
     while (xmlReader.Read()) 
     { 
      if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Base")) 
      { 
       if (xmlReader.HasAttributes) 
        Console.WriteLine(xmlReader.GetAttribute("Name") + ": " + xmlReader.GetAttribute("CoverBaseFolder")); 
      //Base Name 
       base7.Add(new Bases() { BaseName = xmlReader.GetAttribute("Name"), Basefolder = xmlReader.GetAttribute("CoverBaseFolder") }); 
      } 
     } 
     mainbox.ItemsSource = base7; 

輸出是一個列表項,其中節點的名稱和同一節點的子元素的數量。

var list = XElement.Load("test.xml") 
    .Elements("Base") 
    .Select(e => new 
    { 
     Name = e.Attribute("Name").Value, 
     Count = e.Elements().Count() 
    }) 
    .ToList(); 

但是,如果你想使用XmlReader,例如,使用XML不適合在內存中運行,代碼是更繁瑣:

+1

你有代碼可以讀取嗎? – Sal

+1

您能否爲您的示例提供預期的輸出? –

+0

我已添加了用於閱讀XML的代碼。 – hemarn

回答

4

這可以很容易地通過使用LinqToXml來完成:

var bases = new List<Base>(); 

using (var xmlReader = XmlReader.Create("test.xml")) 
{ 
    while (xmlReader.Read()) 
    { 
     if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Base")) 
     { 
      var name = xmlReader.GetAttribute("Name"); 
      int count = 0; 
      using (var innerReader = xmlReader.ReadSubtree()) 
      { 
       while (innerReader.Read()) 
       { 
        if (innerReader.NodeType == XmlNodeType.Element && innerReader.Name == "Book") 
         count++; 
       } 
      } 
      bases.Add(new Base { Name = name, Count = count }); 
     } 
    } 
} 


class Base 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
} 

來算子點頭方便地使用ReadSubtree方法。

XmlReader類有許多有用的方法。使用ReadToFollowing方法可以稍微減少代碼。

var bases = new List<Base>(); 

using (var xmlReader = XmlReader.Create("test.xml")) 
{ 
    while (xmlReader.ReadToFollowing("Base")) 
    { 
     string name = xmlReader.GetAttribute("Name"); 
     int count = 0; 
     using (var innerReader = xmlReader.ReadSubtree()) 
     { 
      while (innerReader.ReadToFollowing("Book")) 
       count++; 
     } 
     bases.Add(new Base { Name = name, Count = count }); 
    } 
} 
+0

謝謝亞歷山大:)它非常整潔有用! – hemarn