使用紧密的快捷方式解析XML

时间:2013-08-25 06:37:41

标签: c# .net xml parsing

我似乎对我要解析的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库?

2 个答案:

答案 0 :(得分:3)

首先,除非你真的需要,否则我会避免使用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);
}

答案 1 :(得分:0)

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

 do {
     reader.Read();
     Logger.Log(reader.Name);
 }
 while (reader.NodeType != XmlNodeType.EndElement);