[英]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.