我收到了一个webservice调用的规范,如下所示:
<?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>
答案 0 :(得分:1)
这是某种标准的序列化格式吗?
我真的希望不是,这太可怕了。值得在http://thedailywtf.com/
宣传如何将信息提取到.net类中的任何好主意?
假设样本不完整且真实的是有效的XML,那么任何.NET XML API都能够做到这一点。 (XML序列化程序,包括数据契约,如果不花费很多精力为所有额外级别的元素创建包装类型,就不太可能工作。)
也许将这个“服务”的作者指向OData来展示可能的东西,而不是极其重新发明它。
答案 1 :(得分:1)
我发现它是一种称为XML-RPC的标准格式,它在SO上有自己的标记。 Official site Wikipedia
有一个.Net库available