xmlSerializer.Deserialize格式不正确的XML

时间:2013-10-07 14:24:29

标签: c# xml xslt serialization xmlserializer

我正在尝试反序列化XML(下面)

由于XML的“非标准”结构,我陷入困境。而不是序列化Products集合的常规方法,即:具有许多子元素的父级。它们有许多父元素,每个元素都有一个子元素。

我的问题是由于这个不寻常的数组结构(我怀疑是由于一个错误),我无法弄清楚如何设置属性,即:[XMLArrayItem],以便我可以提取有意义的数据。

注意:XML是来自公共第三方的HTTPResponse。 (所以我无法让他们改变它。)

具体而言:而不是<产品>父母有很多<产品与GT;元素。

< betType>节点有多个<产品>每个父元素都有一个<产品与GT;儿童元素。

您可以完全自由地创建具有所需属性的任何类。 显然,该解决方案需要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重新格式化它,但我希望有一种方法可以使用属性来完成它。我认为它更清洁,&amp;我不确定我是如何编写XSLT的。

注意:或者,如果您可以建议一种方法“不生成”父阵列的节点&amp;只需为每个数组项创建节点,这将有所帮助。作为我尝试过的方法之一非常接近。但我仍然有一个“产品”节点,它是多个Products节点的父节点,每个节点都包含一个Product节点。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如有疑问,请为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>