10

拡張機能がある場合、派生要素が基本クラス要素の前にあることをどのように保証できますか? デフォルトは逆です。を使用したかったallのですが、それが不可能であることはわかっています。

<xs:complexType name="BaseClass">
  <xs:sequence>
    <xs:element name="foo" type="xs:string/>
    <xs:element name="bar" type="xs:string/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="DerivedClass">
  <xs:complexContent>
    <xs:extension base="BaseClass">
      <xs:sequence>
        <!-- This makes the order foo, bar, cheese, tomato -->
        <!-- But I need cheese, tomato, foo, bar -->
        <xs:element name="cheese" type="xs:string/>
        <xs:element name="tomato" type="xs:string/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:element name="BaseClass" type="BaseClass"/>
<xs:element name="DerivedClass" type="DerivedClass" substitutionGroup="BaseClass"/>

受け入れたいxmlは次のようになります。

<mylist>
    <BaseClass>
     <foo>lala</foo>
     <bar>lala</bar>
    </BaseClass>
    <DerivedClass>
     <cheese>cheddar</cheese>
     <tomato>red</tomato>
     <foo>lala</foo>
     <bar>lala</bar>
    </DerivedClass>
</mylist>

現時点では、すべての要素をコピーすることも考えてBaseClassDerivedClassますが、置換グループで何が起こるのか、何が起こらないのかわかりません。

4

3 に答える 3

0

PHP によって生成された XML を検証するときに、同じ問題に直面しました。

これが私がそれを解決した方法です。基本的、

  1. すべての php クラス プロパティを反復処理し、
  2. 現在のクラスの内容を 1 つの配列にプッシュし、
  3. 親クラスから別の配列にプッシュします。
  4. 現在のクラス プロパティを親クラス プロパティの末尾にマージします
  5. 並べ替えられたプロパティ配列から XML を生成します
于 2016-06-12T17:15:00.477 に答える