C# 使用 XMLReader(?) 读取子元素
Posted
技术标签:
【中文标题】C# 使用 XMLReader(?) 读取子元素【英文标题】:C# Read Sub Elements with XMLReader(?) 【发布时间】:2019-03-08 19:11:22 【问题描述】:我目前正在努力从子元素中读取子元素。读取这样结构的 XML 的最佳方法是什么:
<network>
<channel type="...">
<sub1.1>...</sub1.1>
<sub1.2>...</sub1.2>
...
</channel>
<channel type="...">
<sub1.1>...</sub1.1>
<sub1.2>...</sub1.2>
...
</channel>
...
<group number="...">
<sub2.1>...</sub2.1>
<sub2.2>...</sub2.2>
...
</group>
...
<group number="...">
<sub2.1>...</sub2.1>
<sub2.2>...</sub2.2>
...
</group>
...
<gateway id="...">
<sub3.1>...</sub3.1>
<sub3.2>...</sub3.2>
<sub3.3>
<sub3.3.1>...</sub3.3.1>
</sub3.3>
<sub3.4>
<sub3.4.1>...</sub3.4.1>
</sub3.4>
...
</gateway>
...
<network>
我想阅读类型、编号、id 等属性以及所有子元素和子子元素。我用 XMLReader 尝试过,但在获取子子元素等方面遇到了困难......
如果有人可以帮助我找到一种方法,我将非常感激。
【问题讨论】:
MSDN XMLReader 文档非常好。检查此链接docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 【参考方案1】:您可以使用MoveToFirstElementAttribute()
和MoveToNextAttribute()
来获取属性的名称(及其值)
string fileName = @"C:\file.xml";
using (XmlTextReader reader = new XmlTextReader(fileName)) //using System.Xml
while (reader.Read())
if (reader.NodeType == XmlNodeType.Whitespace || reader.NodeType == XmlNodeType.EndElement) continue;
Console.WriteLine("\n------------------------------------------------------------------------------");
string message = $"Position: reader.LineNumber,reader.LinePosition\tNode Type: reader.NodeType.ToString()\tDepth: reader.Depth\n";
if (reader.Name.Trim() != "") message += $"Name: reader.Name\t";
if (reader.Value.Trim() != "") message += $"Value: reader.Value\t";
Console.WriteLine(message);
// Read() method doesn't get into attribute nodes, so check them manually then get them by MoveToFirstElementAttribute() and MoveToNextAttribute() methods
if (reader.HasAttributes)
Console.WriteLine($"\nHas reader.AttributeCount Attribute(s):\n");
reader.MoveToFirstAttribute();
Console.WriteLine($"Attribute Name: reader.Name\tValue: reader.Value");
while (reader.MoveToNextAttribute())
Console.WriteLine($"Attribute Name: reader.Name\tValue: reader.Value");
reader.MoveToElement();
我使用了 XmlTextReader(它是 XmlReader 的子类),因为它包含行信息。如果你想使用 XmlReader 那么你可以用 XmlTextReader 替换它(除了 XmlReader 没有 LineNumber 和 LinePosition 属性)
您还可以通过Depth
属性检查元素的“子属性”。请记住,Depth
从 0 开始(最外面的元素 Depth 值将是 0)
【讨论】:
以上是关于C# 使用 XMLReader(?) 读取子元素的主要内容,如果未能解决你的问题,请参考以下文章
使用 xmlReader 在 C# 中过滤特定元素值的大型 XML
C# XmlReader 根据我调用阅读器方法的方式读取 XML 错误且不同
XmlReader - 如何在没有 System.OutOfMemoryException 的情况下读取元素中很长的字符串