【问题标题】:Parsing XML into .Net class将 XML 解析为 .Net 类
【发布时间】:2010-11-17 14:17:59
【问题描述】:

我收到了一个 Web 服务调用的规范,如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <struct>
                                <member>
                                    <name>OrderNumber</name>
                                    <value>
                                        <string>101</string>
                                    </value>
                                </member>
                                <member>
                                    <name>Created</name>
                                    <value>
                                        <string>2010-11-01 11:00:00</string>
                                    </value>
                                </member>
                                <member>
                                    <name>Rows</name>
                                    <value>
                                        <array>
                                            <data>
                                                <value>
                                                    <struct>
                                                        <member>
                                                            <name>ProductNumber</name>
                                                            <value>
                                                                <string>prod1</string>
                                                            </value>
                                                        </member>
                                                        <member>
                                                            <name>Title</name>
                                                            <value>
                                                                <string>Produkt 1</string>
                                                            </value>
                                                        </member>
                                                    </struct> 
                                                </value>

这是某种标准的序列化格式吗? (我认为服务是用php编写的)

关于如何将信息提取到 .net 类中有什么好的想法吗?

编辑:

我用 xslt 转换解决了这个问题,它创建了一个更“正常”的 xml 文件

<Orders>
    <struct>
        <OrderNumber>101</OrderNumber>
        <Created>2010-11-01 11:00:00</Created>
        <Rows>
            <struct>
                <ProductNumber>prod1</ProductNumber>
                ...

根据结果,很容易创建架构并使用 xsd.exe 生成 .net 类。

变换看起来像:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>

<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="struct"/>

<xsl:template match="/">
    <Orders>
      <xsl:apply-templates/>
    </Orders>
</xsl:template>

<xsl:template match="struct">
    <struct>
        <xsl:apply-templates/>
    </struct>
</xsl:template>

<xsl:template match="value/string|value/double">
    <xsl:value-of select="self::*"/>
</xsl:template>

<xsl:template match="//member">
    <xsl:element name="{name}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="text()"/>
</xsl:stylesheet>

【问题讨论】:

  • TRWTF = XML 格式?嵌套比实际数据多。
  • @delnan:这可能比Extensible XML 更糟

标签: php .net xml-deserialization


【解决方案1】:

这是某种标准的序列化格式吗?

我真的不希望,这太可怕了。值得在http://thedailywtf.com/宣传

关于如何将信息提取到 .net 类中有什么好的想法吗?

假设示例不完整并且真实的东西是有效的 XML,任何 .NET XML API 都可以做到这一点。 (XML 序列化器,包括 Data Contract,如果不为在那里看到的所有额外级别的元素创建包装器类型,就不太可能工作。)

也许将这个“服务”的编写者指向 OData,以展示什么是可能的,而不是极其糟糕地重新发明它。

【讨论】:

  • 谢谢。您对如何使用 XML API 有什么建议吗?我能以某种方式避免深度代码嵌套来获取信息吗?
  • @adrianm:我想在做出选择之前查看多个示例,但我可能会使用 XSLT 进行预处理以消除噪音或查看 XPath(即XPathDocument/@987654323 @) 进行提取。然而,我的首要任务是尝试了解为什么这是正在生成的格式,并查看是否生成了结构较少的内容。
【解决方案2】:

我发现它是一种称为 XML-RPC 的标准格式,它在 SO 上有自己的标签。 Official siteWikipedia

有一个.Net库available

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2011-10-08
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多