0

XML をデシリアライズしようとしています (下記)。

XML の「非標準」構造が原因で行き詰まっています。Products コレクションをシリアル化する通常の方法の代わりに、つまり、多くの子要素を持つ親です。それぞれに単一の子要素を持つ多くの親要素があります。

私の問題は、この異常な配列構造が原因で (バグが原因だと思われます)、意味のあるデータを抽出できるように属性 ie:[XMLArrayItem] を設定する方法がわからないことです。

注: XML は、パブリック サード パーティからの HTTPResponse です。(だから私は彼らにそれを変更させることはできません。)

具体的には: 多くの < Product> 要素を持つ < Products> 親の代わりに。

< betType> ノードには複数の < Products> 親要素があり、それぞれに 1 つの < Product> 子要素があります。

必要なプロパティを持つクラスを自由に作成できます。明らかに、ソリューションには BetType & Product クラスが必要です。Products クラスの有無にかかわらず、両方を試しました。

<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をどのように記述すればよいかわかりません.

注:代わりに、親配列のノードを「生成しない」方法を提案し、各配列項目のノードを作成するだけでよい場合は、それが役立ちます。私が試したアプローチの1つとして、本当に近づいてきました。しかし、それぞれが 1 つの Product ノードを含む複数の Products ノードの親である "Products" ノードがまだありました。

ご協力いただきありがとうございます。

4

1 に答える 1

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>
于 2013-10-07T14:53:00.613 に答える