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 没有 LineNumberLinePosition 属性)

您还可以通过Depth 属性检查元素的“子属性”。请记住,Depth 从 0 开始(最外面的元素 Depth 值将是 0

【讨论】:

以上是关于C# 使用 XMLReader(?) 读取子元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 xmlReader 在 C# 中过滤特定元素值的大型 XML

XmlReader 创建空字符串 C#

C# XmlReader 根据我调用阅读器方法的方式读取 XML 错误且不同

XmlReader - 如何在没有 System.OutOfMemoryException 的情况下读取元素中很长的字符串

C# 使用 XmlReader 但不使用 XmlDocument 获取额外的空白值

C#如何读取XML中指定的节点值?