1

我试图解析的 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 库来支持它吗?

4

2 回答 2

3

首先,除非您真的必须这样做,否则我会避免使用XmlReader- 通常是因为文档很大。如果您正在解析一个您乐于一直在内存中的文档,您可以只使用 LINQ to XML ( XDocument.Loadetc),这会更简单。

在 内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);
}
于 2013-08-25T06:42:24.050 回答
0

我认为 ado-while loop会更合适:

 do {
     reader.Read();
     Logger.Log(reader.Name);
 }
 while (reader.NodeType != XmlNodeType.EndElement);
于 2013-08-25T06:41:25.203 回答