用 C# 解析 XML?

Posted

技术标签:

【中文标题】用 C# 解析 XML?【英文标题】:XML Parsing with C#? 【发布时间】:2010-10-07 05:42:38 【问题描述】:

我正在为学校开展一个涉及大量 XML 解析的项目。我正在用 C# 编码,但我还没有找到一种“合适的”方法来解析这个 XML。我看过几种不同的方法,但还没有弄好;所以我来找你了。理想情况下,我正在寻找类似于 Python 中的 Beautiful Soup 的东西(有点)。

我想知道是否有任何方法可以像这样转换 XML:

<config>
    <bgimg>C:\\background.png</bgimg>
    <nodelist>
        <node>
            <oid>012345</oid>
            <image>C:\\image.png</image>
            <label>EHRV</label>
            <tooltip>
                <header>EHR Viewer</header>
                <body>Version 1.0</body>
                <icon>C:\\ico\ehrv.png</icon>
            </tooltip>
            <msgSource>8181:iqLog</msgSource>
        </nodes>
    </nodeList>
<config>

变成这样的数组/Hastable/Dictionary/Other:

Array
(
["config"] => array
    (
    ["bgimg"] => "C:\\background.png"
    ["nodelist"] => array
        (
        ["node"] => array
            (
            ["oid"] => "012345"
            ["image"] => "C:\\image.png"
            ["label"] => "Version 1.0"
            ["tooltip"] => array
                (
                ["header"] => "EHR Viewer"
                ["body"] => "Version 1.0"
                ["icon"] => "C:\\ico\ehrv.png"
                )
            ["msgSource"] => "8181:iqLog"
            )
        )
    )
)

即使只是给我一个体面的资源来浏览也会非常有帮助。非常感谢。

【问题讨论】:

【参考方案1】:

我会调查Linq to Xml。这为您提供了一个类似于 Xml 文件的对象结构,并且相当容易遍历。

【讨论】:

【参考方案2】:

XmlDocument + XPath 几乎是您在 .NET 中解析 XML 所需的全部内容。

【讨论】:

【参考方案3】:

在 C# 中必须有 1/2 打不同的方法来执行此操作。我最喜欢使用System.Xml 命名空间,尤其是System.Xml.Serialization

您使用名为 xsd.exe 的命令行工具将 xml 示例转换为 xsd 架构文件(提示:确保您的节点列表在示例中具有多个节点),然后在架构上再次使用它来转将其放入一个 C# 类文件中,您可以将其加载到您的项目中,并轻松地与 System.Xml.Serialization.XmlSerializer 类一起使用。

【讨论】:

【参考方案4】:

使用老式 XmlDocument 并不丢人:

var xml = "<config>hello world</config>";
var doc = new System.Xml.XmlDocument();
doc.LoadXml(xml);
var nodes = doc.SelectNodes("/config");

【讨论】:

【参考方案5】:

你应该大胆地使用 LINQ to XML, A.K.A. XLINQ。有一个不错的工具叫做LINQPad,你应该去看看。它有很好的功能,从一个全面的示例库到允许您通过 Linq to SQL 直接查询 SQL 数据库。最重要的是,它可以让您在将查询放入代码之前对其进行测试。

【讨论】:

【参考方案6】:

最佳方法将取决于您在解析数据后实际想要对数据执行的操作。

如果您想以结构化但不绑定到 XML 的方式传递它,XML Serialization 可能是您最好的选择。这也将使您最接近您所描述的内容,尽管您将处理对象图而不是嵌套图。

如果您只是在寻找一种方便的格式来查询特定数据位,您最好的选择是LINQ to Xml。或者,您可以使用 System.Xml 命名空间中更传统的类(以 XmlDocument 开头)并使用 XPath 进行查询。

您也可以使用这些技术中的任何一种(或XmlTextReader)作为构建块来创建您所描述的数据结构,但除非有一些特殊需要,否则我认为它不会为您提供更多的多功能性其他方法会怎样。

【讨论】:

【参考方案7】:

您还可以使用序列化将 XML 文本转换回强类型类实例。

【讨论】:

【参考方案8】:

我个人喜欢使用 System.Xml.Serialization.XmlSerializer 类将 XML 元素映射到类,反之亦然。

http://msdn.microsoft.com/es-es/library/system.xml.serialization.xmlserializer(VS.80).aspx

【讨论】:

【参考方案9】:

我个人使用 XPathDocument、XPathNavigator 和 XPathNodeIterator,例如

XPathDocument xDoc = new XPathDocument(CHOOSE SOURCE!);

XPathNavigator xNav = xDoc.CreateNavigator();

XPathNodeIterator iterator = xNav.Select("nodes/node[@SomePredicate = 'SomeValue']");

while (iterator.MoveNext())

    string val = iterator.Current.SelectSingleNode("nodeWithValue");

    // etc etc

【讨论】:

【参考方案10】:

是的,我同意.. linq 方式非常好。 我特别喜欢你使用它编写 XML 的方式。

使用“对象中的对象”方式要简单得多。

【讨论】:

以上是关于用 C# 解析 XML?的主要内容,如果未能解决你的问题,请参考以下文章

解析无效的 XML C# [重复]

在 C# 代码中解析(大)XML 的最佳方法是啥?

在 C# 中解析大型 XML(大小为 1GB)的最佳方法是啥?

在 C# 中解析 html 的最佳方法是啥? [关闭]

如何在 C# 摘要中包含 html 标记,以便将其作为文本处理(不解析为 XML)?

SQLServer解析xml到Oracle