【问题标题】:XML Parsing with C#?用 C# 解析 XML?
【发布时间】: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"
            )
        )
    )
)

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

【问题讨论】:

    标签: c# xml dictionary parsing


    【解决方案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 的方式。

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-05-23
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多