c# - C# 使用 XMLReader(?) 读取子元素
问题描述
我目前正在努力从子元素中读取子元素。阅读这样结构的 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 尝试过,但在获取子子元素等方面遇到了困难......
如果有人可以帮助我找到一种方法,我将非常感激。
解决方案
您可以使用MoveToFirstElementAttribute()
andMoveToNextAttribute()
获取属性的名称(及其值)
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)
推荐阅读
- discord.js - 更改头像大小 Discord.js
- ios - iOS | 防止 Google 徽标重定向到 Google 地图
- python-3.x - 使用“PyType_FromSpec()”创建的 Python 堆时间能否与弱引用兼容
- css - 如何在涉及大图像的情况下保持 flexbox 容器 50/50?
- flutter - 如何在flutter中加载存储在SharedPreference中的数据
- django - 如何向 JavaScriptCatalog 视图添加断点?
- android - 使用不同的 ID 和/或密钥重建 apk 文件:本机脚本
- flutter - in_app_purchase purchaseID 不保持不变
- c++ - 在 C++ 中除数时如何获得更准确的结果
- r - 部署到 Google Cloud Run 时 Docker 容器无法启动