这是我的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:
List<Bases> base7 = new List<Bases>();

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;

输出是一个列表项,具有节点名称和同一节点的子元素数。

最佳答案

这可以通过使用linqtoxml轻松完成:

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

但是,如果您想使用XmlReader,例如,使用不适合内存的xml,那么代码就要麻烦得多:
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 });
    }
}

关于c# - 如何在C#XmlReader中获取XML节点子代的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45380626/

10-17 02:25