【问题标题】:Parsing XML with close shortcut使用关闭快捷方式解析 XML
【发布时间】:2013-08-25 06:37:41
【问题描述】:

我尝试解析的 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# 似乎不支持带有关闭快捷方式 (&lt;tag attribute="value" /&gt;) 的标签。

这是我的代码:

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 库来支持它吗?

【问题讨论】:

  • 应该,但是您的实例没有正确关闭?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 仅供参考,C# 根本不支持 XML。支持全部是 .NET Framework 的一部分,而不是编程语言的一部分。

标签: c# .net xml parsing


【解决方案1】:

首先,我会避免使用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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2010-09-13
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多