【问题标题】:Different ways for parsing XML解析 XML 的不同方法
【发布时间】:2009-06-08 22:53:21
【问题描述】:

我是 XML 的初学者。我创建了一个简单的 XML 文件并尝试解析它并将值分配给变量。它有效,但我使用的方法让我想知道是否有更好的方法,如果你愿意的话,更优雅,来完成这项任务。有吗?

这是我的 XML 文件:

<start>
<record>
<var1>hello</var1>
<var2>world</var2>
</record>
<record>
<var1>another</var1>
<var2>one</var2>
</record>
</start>

这是我使用的方法:

string var1 = "", var2 = "";

using(XmlReader r = XmlReader.Create(file))
{
    while(r.Read())
    {
        if (r.MoveToContent() == XmlNodeType.Element)
        {
            if(r.Name == "record")
            {
                var1 = "";
                var2 = "";
            }
            else if(r.Name = "var1")
                var1 = r.ReadElementString();
            else if(r.Name = "var2")
                var2 = r.ReadElementString();
        }
        else if(r.MoveToContent() == XmlNodeType.EndElement && r.Name == "record")
        {
            Console.WriteLine(var1 + " " + var2);
        }
    }

}

【问题讨论】:

    标签: .net xml parsing


    【解决方案1】:

    你试过Linq To XML 吗?

    我对它很陌生,所以这段代码可能会做得更好,但我认为这行得通:

    XElement xmlData = XElement.Load("XmlFile.xml");
            string var1, var2;
            foreach (XElement element in xmlData.Elements("record"))
            {
                var1 = element.Element("var1").Value;
                var2 = element.Element("var2").Value;
    
                Console.WriteLine(var1 + " " + var2);
    
            }
    

    【讨论】:

      【解决方案2】:

      真正的男人不会解析,他们deserialize

      【讨论】:

      • 好一个!反正那里很少有真正的男人
      【解决方案3】:

      这是一个使用 VB 的 XML 文字特性的版本。

      Dim doc = XDocument.Load(file)
      For Each element In doc...<record>
          Dim var1 = element.<var1>.Single()
          Dim var2 = element.<var2>.Single()
          Console.WriteLine(var1.Value & var2.Value)
      Next
      

      【讨论】:

        【解决方案4】:

        一种选择是将整个文档加载到 XmlDocument 中并使用 Xpath 语法来提取值 - 适用于小型(ish)文档,但不适用于大型文档,因为您将有内存开销并且您将拥有解析整个文档,而不仅仅是您想要的数据。像这样的东西会起作用(为了清楚起见,删除了任何错误检查):

        XmlDocument doc = new XmlDocument();
        doc.Load(filename);
        
        XmlNodeList records = doc.SelectNodes("/start/record");
        foreach(XmlNode n : records)
        {
           string var1 = n.SelectSingleNode("var1").InnerText;
           string var2 = n.SelectSingleNode("var2").InnerText;
        }
        

        【讨论】:

          【解决方案5】:

          我建议选择 Serialize/DeSerialize 选项。这将更加动态且不易出错。这样,您需要为每一次更改大量维护您的代码。

          【讨论】:

            【解决方案6】:

            我将支持 XmlSerializer 的调用。为您的格式编写一个 XML Schema,从中生成序列化程序类,然后您就可以免费获得方便的界面和自动验证。它的性能也相当不错。

            【讨论】:

              【解决方案7】:

              天哪,您绝对应该像其他人建议的那样考虑 XmlDocument、LINQ to XML 或 XmlSerializer。我用过 XmlReader,它不适合胆小的人。它的优点是成为 4 个选项中唯一一个可以读取巨大的 XML 文件而不会将整个内容读入内存的选项,但如果这不是问题,那么您可以通过使用其中一个来帮自己一个大忙直观的 API。

              如果您对 XML 的格式有发言权,我强烈推荐使用 XmlSerializer 方法,因为它将整个 XML 特性排除在外。通过使用属性和类的简单属性,您可以在一定程度上控制对象的格式。但除此之外,LINQ to XML 是第二简单的。

              【讨论】:

                【解决方案8】:

                我通常只是将 XML 反序列化为一组对象,然后我可以循环处理这些对象。这将需要创建与您的 xml 结构的架构相匹配的 serealizable 对象。如果您不想这样做,Visual Studio 附带了一个名为 XSD 的不错的小功能,它允许您从 XML 文件生成类对象。您可以从 Visual Studio 命令提示符运行 XSD。如果你有兴趣,这就是你的方式:

                运行以下命令: XSD path_to_your_xml.xml /o:your_output_directory 这将为 XML 生成架构。

                一旦你有了它,你就可以通过这样做来生成类对象: XSD path_to_your_schema.xsd /c /l:cs /o:your_output_directory 这将生成带有一组反序列化 XML 文件所需的类的 .cs 文件。

                这个方法唯一的一点是它使用数组来收集。我通常将它们更改为列表。只是个人喜好。 应该是这样的。剩下要做的就是编写反序列化 xml 的小函数。您可以输入“xsd /?”查看您可能感兴趣的其他参数列表。

                【讨论】:

                  【解决方案9】:

                  有几种方法可以做到这一点。 How does one parse XML files?

                  【讨论】:

                    【解决方案10】:

                    正如史蒂夫巴尔默所说 - “反序列化!,反序列化!,反序列化!”

                    【讨论】:

                      【解决方案11】:

                      我更喜欢 XmlDocument 路由:

                      这是一篇关于 CodeProject 的优秀文章:

                      http://www.codeproject.com/KB/cpp/parsefilecode.aspx

                      【讨论】:

                        【解决方案12】:
                        【解决方案13】:

                        嗯,我发现 XmlDocument 超级简单,但有它自己的开销类型。这是一篇非常好的文章,我发现它非常有用。

                        http://support.softartisans.com/kbview.aspx?ID=673

                        【讨论】:

                        • 是的,当然不是更快的方法,只是使用恕我直言更简单更干净
                        【解决方案14】:

                        我真的很喜欢使用 XDocument 或 XElement 的 Linq 方式。 这真是太棒了,尤其是如果您也在编写 XML。

                        【讨论】:

                          【解决方案15】:

                          我为 ANTLR 2.x 编写了一个扩展名为 ANTXR 的 XML 解析。可以很容易地挑选出您关心的 XML 部分,无论是标签内容还是属性。

                          http://javadude.com/tools/antxr/index.html

                          【讨论】:

                            【解决方案16】:

                            我喜欢几个人建议的序列化/反序列化选项。

                            应该反序列化成这样的:

                            [Serializable]
                            class record {
                                string var1 { get; set; }
                                string var2 { get; set; }
                            }
                            

                            要反序列化元素数组,您需要 XmlArrayItemAttribute - 在 MSDN 上查看此类。

                            HTH!

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2020-08-27
                              • 2018-01-17
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2023-03-12
                              • 2010-10-11
                              相关资源
                              最近更新 更多