0

この記事の内容はすべて理解できたと思いますが、まだ作業が残っているようです。

クラスに単純な継承ツリーがある場合:

A (abstract)
^
B
^
C

そして、次のように xml にオブジェクトの単純なリストが必要です。

<mylist>
    <B>lalala</B>
    <C>fofofo</C>
    <C>fofofo</C>
    <C>fofofo</C>
    <C>fofofo</C>
    <B>lalala</B>
</mylist>

このスキームを以下に対して検証しようとすると、うまくいかないようです:

<xs:schema>
    <xs:complexType name="A" abstract="true">
        <xs:element name="text" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="B">
        <xs:complexContent>
            <xs:extension base="A"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="C">
        <xs:complexContent>
            <xs:extension base="B"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="mylist>
        <xs:sequence maxOccurs="unbounded">
            <xs:element name="A" type="A"/>
        </xs:sequence>
    </xs:element>
</xs:schema>

これは、多くの名前空間を持たない短い xml のための単なる疑似コードであることを忘れないでください。

バリデーターが (たとえば、notepad++) に、または<A>ではなく、まだ期待していることを通知するのはなぜですか?<B><C>

4

1 に答える 1

1

あなたは近づいています。しかし、要素名と型名を混同しています。型 B と C は型 A の代わりに使用できますが、B と C という名前の要素をまったく宣言しておらず、それらを宣言して要素 A の代わりに使用できるようにしたことは言うまでもありません。

次の XML インスタンスは、修正されたバージョンのスキーマに対して有効です。

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Mamix.xsd">
    <A xsi:type="B"><text>lalala</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="B"><text>lalala</text></A>
</mylist>

代わりに要素 B と C を許可する場合は、それらを適切な型で宣言し、それらが要素 A の代用可能であることを指定します (これを可能にするには、最上位の要素である必要があります)。スキーマは次のようになります。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="A" abstract="true">
        <xs:sequence>
            <xs:element name="text" type="xs:string"/>
        </xs:sequence>        
    </xs:complexType>

    <xs:complexType name="B">
        <xs:complexContent>
            <xs:extension base="A"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="C">
        <xs:complexContent>
            <xs:extension base="B"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="A" type="A"/>
    <xs:element name="B" type="B" substitutionGroup="A"/>
    <xs:element name="C" type="C" substitutionGroup="A"/>

    <xs:element name="mylist">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element ref="A"/>
            </xs:sequence>            
        </xs:complexType>
    </xs:element>

</xs:schema>

このスキーマに対して、次のインスタンス ('A' の宣言に必要な 'text' 要素を追加して元の XML から変更) は有効です。

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Mamix.xsd">
    <B><text>lalala</text></B>
    <C><text>fofofo</text></C>
    <C><text>fofofo</text></C>
    <C><text>fofofo</text></C>
    <C><text>fofofo</text></C>
    <B><text>lalala</text></B>
</mylist>
于 2013-09-16T19:58:29.957 に答える