2017-07-28 121 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