解析XML的不同方法

时间:2009-06-08 22:53:21

标签: .net xml parsing

在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);
        }
    }

}

16 个答案:

答案 0 :(得分:6)

你试过Linq To XM L?

我是新手,所以这段代码可能会做得更好,但我觉得这样做有用:

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);

        }

答案 1 :(得分:6)

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

答案 2 :(得分:4)

这是一个使用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

答案 3 :(得分:3)

一个选项是将整个文档加载到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;
}

答案 4 :(得分:3)

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

答案 5 :(得分:3)

我将第二次调用XmlSerializer。为您的格式编写XML Schema,从中生成序列化程序类,并获得方便的界面和自动验证,所有这些都是免费的。它的表现也很不错。

答案 6 :(得分:3)

天哪,你应该像其他人所建议的那样考虑XmlDocument,LINQ to XML或XmlSerializer。我已经使用过XmlReader而不是那个胆小的人。它的优势在于它是4个选项中唯一一个可以读取大量XML文件而无需将整个内容读入内存的选项,但如果这不是一个问题,那么你可以通过使用其中一个来自己做一个巨大的帮助直观的API。

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

答案 7 :(得分:3)

我通常只是将XML反序列化为一组对象,然后我可以循环并处理它们。这将需要创建与您的xml结构的模式匹配的可实现的对象。如果您不想这样做,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 这将生成.cs文件,其中包含一组必要的类,用于取消XML文件。

这种方法的唯一之处在于它使用数组进行集合。我通常会将它们更改为列表。只是个人喜好。 那应该是它。剩下要做的就是写下你的xml反序列化的小功能。你可以输入“xsd /?”查看您可能感兴趣的其他参数列表。

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

我更喜欢XmlDocument路线:

这是关于CodeProject的优秀文章:

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

答案 11 :(得分:1)

答案 12 :(得分:1)

好吧,我发现XmlDocument非常容易,但它有自己的开销类型。这是一篇非常好的文章,我发现它很有用。

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

答案 13 :(得分:1)

我非常喜欢使用XDocument或XElement的Linq-way .. 这非常棒,特别是如果你也在编写XML。

答案 14 :(得分:0)

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

请参阅http://javadude.com/tools/antxr/index.html

答案 15 :(得分:0)

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

应该反序列化为这样的东西:

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

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

HTH!