0

「フィールド」と呼ばれる要素と「複合フィールド」と呼ばれるその拡張を含むxmlスキーマを定義しました。次のように定義されています。

<xs:complexType name="field">
        <xs:sequence>
            <xs:element name="value" type="xs:string" />
        </xs:sequence>      
</xs:complexType>
<xs:complexType name="composite-Field">
        <xs:complexContent>
          <xs:extension base="field">
            <xs:sequence>
                    <xs:element name="length" type="xs:integer" />
                  </xs:sequence>
                </xs:extension>
        </xs:complexContent>
</xs:complexType>

私のXML utでそれを使用するには、次のようにする必要があります。

<field xsi:type="composite-Field">
  <value>enjoy</value>
  <length>30</length>
</field>

XML ユーザーにxsi :type=... などのスキーマ構文を使用してほしくない」

<composite-Field>
      <value>enjoy</value>
      <length>30</length>
</composite-Field>

したがって、要素の名前はその継承を暗示し、ユーザーに type 属性の追加を強制しませんか??

私はこれを試しました:

<xs:element name="MyCompositeField" type="composite-field"/>

その後:

<MyCompositeField>
          <value>enjoy</value>
          <length>30</length>
</MyCompositeField>

しかし、XSD スキーマ検証にも合格しませんでした


12/09/2010:提案された回答に応えて、質問を少し洗練させました。
スキーマは次のようになります。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <xs:element name="general">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="field" type="field" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="field"> 
        <xs:sequence> 
            <xs:element name="value" type="xs:string" /> 
        </xs:sequence> 
    </xs:complexType> 



    <xs:complexType name="composite-Field" > 
        <xs:complexContent> 
            <xs:extension base="field" > 
                <xs:sequence> 
                    <xs:element name="length" type="xs:integer" /> 
                </xs:sequence> 
            </xs:extension> 
        </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="MyCompositeField" type="composite-Field"/> 

</xs:schema> 

必要な xml は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
 <general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
    <MyCompositeField> 
        <value>enjoy</value> 
        <length>30</length> 
    </MyCompositeField> 

 </general>

この組み合わせを使用すると、次のエラー メッセージが表示されます。

cvc-complex-type.2.4.a: 要素「MyCompositeField」で始まる無効なコンテンツが見つかりました。「{field}」のいずれかが必要です。

4

1 に答える 1

1

あなたの質問の更新は、実際の問題が<general>要素にあることを示しています。有効なドキュメントは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
    <field> 
        <value>enjoy</value> 
    </field> 
</general>

タイプ「フィールド」を拡張しても、元のタイプは変更されません。代わりに、古い「フィールド」タイプに基づく新しいタイプを作成します。要素の子として両方<value>の要素を持ちたい場合は、要素のタイプを「フィールド」から「複合フィールド」に変更する必要があります。<length><field><field>

<xs:element name="general">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="field" type="composite-Field" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

これによりドキュメントが検証されます

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
    <field> 
        <value>enjoy</value> 
        <length>30</length> 
    </field> 
</general>

他の解決策は、要素の代わりに<general>子要素を持つ要素を変更することです。これは、コンテンツ タイプ「複合フィールド」が既にあるためです。<MyCompositeField><field><MyCompositeField>

<xs:element name="general">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="MyCompositeField" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

ドキュメントを検証する

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
    <MyCompositeField>
        <value>enjoy</value>
        <length>30</length>
    </MyCompositeField>
</general>

更新 2010-08-14

元の投稿者によるコメント:

しかし、「一般」要素に「フィールド」または「複合フィールド」のいずれかを含める機能が必要です。これらのタイプの 1 つだけを持つことを厳密にする必要はありません。

あなたの本当の問題は、スキーマでこれらのドキュメントの両方を検証することですか?

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="schema2.xsd">
    <field> 
        <value>enjoy</value> 
    </field> 
</general>

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="schema2.xsd">
    <MyCompositeField>
        <value>enjoy</value>
        <length>30</length>
    </MyCompositeField>
</general>

その場合、質問全体は次のようになります。

  1. 「要素がこれらの選択肢の1つを子要素として持つことを許可する方法は?」
    またはあなたのタイプがほとんど似ているため:
  2. 「オプションの要素 (存在しない要素) を許可する方法は?」

達成したい目標/コードは何か、問題の原因となっている現在のコードは何かを最初に明確に述べていれば、質問全体をはるかに迅速に解決できたはずです。

#1 への回答<xs:choice>複数の独立した子コンテンツの 1 つを許可するために使用します。

この構造を使用すると、または子要素の<general>いずれかを持つことができます<field><MyCompositeField>

<xs:element name="general">
    <xs:complexType>
        <xs:choice>
            <xs:element name="field" type="field" />
            <xs:element name="MyCompositeField" type="composite-Field" />
        </xs:choice>
    </xs:complexType>
</xs:element>

したがって、スキーマのこの変更により、上で投稿した両方のドキュメントが許可されます。

#2への回答タイプを持つ唯一の理由がcomposite-Fieldオプションの<length>要素を許可することである場合、元のfieldタイプを簡単に変更してタイプの代わりに使用できますcomposite-Field

<xs:complexType name="field"> 
    <xs:sequence> 
        <xs:element name="value" type="xs:string" /> 
        <xs:element name="length" type="xs:integer" minOccurs="0" /> 
    </xs:sequence> 
</xs:complexType> 

このスキーマ定義は、オプションの長さ要素を許可するタイプを作成し、これらのドキュメントの両方を検証します

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="schema2.xsd">
    <field> 
        <value>enjoy</value> 
    </field> 
</general>

<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="schema2.xsd">
    <field> 
        <value>enjoy</value> 
        <length>30</length> 
    </field> 
</general>
于 2010-09-07T16:44:13.090 に答える