xmlSerializer.Deserialize 格式不佳的 XML.
本文关键字:XML Deserialize 格式 xmlSerializer | 更新日期: 2023-09-27 18:34:10
我正在尝试反序列化XML(如下(
由于XML的"非标准"结构,我陷入了困境。而不是序列化产品集合的常规方法,即:具有许多子元素的父元素。它们有许多父元素,每个父元素都有一个子元素。
我的问题是,由于这种不寻常的数组结构(我怀疑是由于错误(,我无法弄清楚如何设置属性,即:[XMLArrayItem]以便我可以提取有意义的数据。
注意:XML 是来自公共第三方的 HTTPResponse。(所以我无法让他们改变它。
具体来说:不是<产品>而是具有许多<产品>元素的父元素。 产品>产品>
您可以完全自由地创建具有所需任何属性的任何类。显然,解决方案需要BetType和产品类别。我已经尝试过有和没有产品类。
<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>
理想情况下,我们可以使用 .Net C# xmlSerializer,因为我将它用于所有其他调用。这个样本是嵌套在HTTPResponse深处的一个小片段。
一种可能的替代方法是使用 XSLT 重新格式化它,但我希望有一种方法可以使用属性来做到这一点。我认为它更干净,我不确定如何编写 XSLT 来做到这一点。
注意:或者,如果您可以建议一种方法来"不生成"父数组的节点,而只是为每个数组项创建节点,那将有所帮助。因为我尝试过的方法之一非常接近。但我仍然有一个"产品"节点,它是多个产品节点的父节点,每个节点都包含一个产品节点。
感谢您的帮助。
如有疑问,请为 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>