C# xmlSerializer。反序列化格式错误的XML
我正在尝试反序列化XML(如下所示) 由于XML的“非标准”结构,我陷入了困境。而不是序列化产品集合的常规方法,即:具有许多子元素的父元素。它们有许多父元素,每个都有一个子元素 我的问题是,由于这种不寻常的数组结构(我怀疑是由于一个bug),我不知道如何设置属性,即:[XMLArrayItem],以便提取有意义的数据 注意:XML是来自公共第三方的HTTPResponse。(所以我无法让他们改变。) 具体地说:不是包含许多C# xmlSerializer。反序列化格式错误的XML,c#,xml,xslt,serialization,xmlserializer,C#,Xml,Xslt,Serialization,Xmlserializer,我正在尝试反序列化XML(如下所示) 由于XML的“非标准”结构,我陷入了困境。而不是序列化产品集合的常规方法,即:具有许多子元素的父元素。它们有许多父元素,每个都有一个子元素 我的问题是,由于这种不寻常的数组结构(我怀疑是由于一个bug),我不知道如何设置属性,即:[XMLArrayItem],以便提取有意义的数据 注意:XML是来自公共第三方的HTTPResponse。(所以我无法让他们改变。) 具体地说:不是包含许多元素的父级 节点有多个父元素,每个都有一个子元素 您完全可以自由创建具有所
<rootnode>
:
<bet_types>
<bet_type id="105">
<name>Exacta</name>
<products>
<product id="17">
<name>STAB</name>
<max_stake>10000</max_stake>
<allow_multiple>0</allow_multiple>
<allow_flexi>1</allow_flexi>
<product_default>1</product_default>
</product>
</products>
<products>
<product id="25">
<name>NSW</name>
<max_stake>10000</max_stake>
<allow_multiple>0</allow_multiple>
<allow_flexi>1</allow_flexi>
</product>
</products>
</bet_type>
<bet_type id="107">
<name>Quinella</name>
<products>
<product id="18">
<name>STAB</name>
<max_stake>10000</max_stake>
<allow_multiple>0</allow_multiple>
<allow_flexi>1</allow_flexi>
<product_default>1</product_default>
</product>
</products>
<products>
<product id="26">
<name>NSW</name>
<max_stake>10000</max_stake>
<allow_multiple>0</allow_multiple>
<allow_flexi>1</allow_flexi>
</product>
</products>
</bet_type>
:
</rootnode>
:
精确的
刺
10000
0
1.
1.
新南威尔士州
10000
0
1.
奎内拉
刺
10000
0
1.
1.
新南威尔士州
10000
0
1.
:
理想情况下,我们可以使用.Net C#xmlSerializer,因为我将它用于所有其他调用。这个样本是一个嵌套在HTTPResponse深处的小片段
一种可能的替代方法是使用XSLT重新格式化它,但我希望有一种方法可以通过属性来实现。我认为它更干净&我不确定如何编写XSLT来做到这一点
注意:或者,如果您可以建议一种方法来“不生成”父数组的节点&只需为每个数组项创建节点,这会有所帮助。作为我尝试过的方法之一,它已经非常接近了。但我仍然有一个“Products”节点,它是多个Products节点的父节点,每个节点都包含一个Product节点
感谢您的帮助。如有疑问,请为您的XML文档创建一个XML架构,并在其上运行
xsd.exe
。然后可以查看(或使用)生成的代码
首先,这里有一个与上面发布的XML相匹配的XML模式。运行xsd.exe/c/f/n:Your.Namespace.Here FileName.xsd
生成代码
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >
<xs:element name="rootnode">
<xs:complexType>
<xs:sequence>
<xs:element name="bet_types">
<xs:complexType>
<xs:sequence>
<xs:element name="bet_type" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="products" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="product">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="max_stake" type="xs:int" />
<xs:element name="allow_multiple" type="xs:int" />
<xs:element name="allow_flexi" type="xs:int" />
<xs:element name="product_default" type="xs:int" minOccurs="0" />
</xs:sequence>
<xs:attribute name="id" type="xs:int" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:int" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
那么为什么不能使用XMlElement.SetAttribute呢?有趣的是,这起作用了。正如我最初使用XSD从返回的XML创建模式一样&然后使用它创建我正在使用的类。它在大多数情况下运行良好,但为此生成了不正确的clas,因此我只获得Products数组中最后一项的实例。可能是f/f标志起了神奇的作用。或者,它可能是一种从更简单的模式中生成更好的类的方法。(即:由于大型复杂模式而导致的一些模糊错误。或者可能大型XML产生了不准确的XSD。教训是:尝试将复杂模式分解为多个部分。感谢Micheal教授,我想投票支持你的答案,但我丢失了我的工作电子邮件&现在不得不在声誉不足的情况下重新开始参与任何事情。