使用关闭快捷方式分析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库可以支持它?

使用关闭快捷方式分析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);