使用关闭快捷方式分析XML
本文关键字:XML 快捷方式 | 更新日期: 2023-09-27 18:28:51
我试图解析的XML似乎有问题。
XML如下所示:
<room>
<property1>3</property1>
<property2>2</property2>
...
<instances>
<instance name="instance1" x="0" y="0" />
<instance name="instance2" x="0" y="0" />
<instances>
</room>
我正在尝试遍历所有的instance
标记,但是C#似乎不支持带有关闭快捷方式(<tag attribute="value" />
)的标记。
这是我的代码:
XmlReader reader = XmlReader.Create("file.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "instances")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
Logger.Log(reader.Name);
}
}
}
它似乎只迭代一个instance
标记,跳过其余的。我尝试了一些方法,包括LINQ和XDocument,但似乎有同样的效果。然后我意识到可能是这样,因为C#不支持标记关闭快捷方式。这是真的吗?有没有一种方法可以支持关闭快捷方式?我是不是做错了什么?
如果C#不支持关闭快捷方式,有没有一个好的C#XML库可以支持它?
首先,我会避免使用XmlReader
,除非你真的必须这样做——通常是因为文档很大。如果您正在解析一个您很乐意一直保存在内存中的文档,那么您只需使用LINQ to XML(XDocument.Load
等),它会简单得多。
在XmlReader
中,您可以使用IsEmptyElement
来检测您在这样的元素上,并避免再次调用Read
。
下面是一个使用LINQ to XML读取所有instance
元素的示例:
XDocument doc = XDocument.Load("file.xml");
foreach (var instance in doc.Descendants("instance"))
{
Logger.Log(instance.Attribute("name").Value);
}
我认为do-while loop
更合适:
do {
reader.Read();
Logger.Log(reader.Name);
}
while (reader.NodeType != XmlNodeType.EndElement);