簡體   English   中英

如何在c#XmlReader中獲取XML節點子代的數量?

[英]How do I get number of a XML nodes child in 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:

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 });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM