如何在c#XmlReader中获取XML节点子节点的数量?

问题描述 投票:2回答:1

这是我的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;

输出是一个列表项,其中包含节点名称和同一节点的子元素数。

c# xml
1个回答
4
投票

使用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 });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.