web-dev-qa-db-ja.com

XSD-最初の要素がシーケンスの最初に表示される必要がある、順序付けられていない要素タイプのセットをどのように説明しますか?

これはXMLスキーマの質問です。

そんなこと知ってる xsd:all要素はシーケンスに表示できません(そのタイプの最上位要素である必要があります)。

つまり、次のものは使用できません。

<xsd:complexType name="Application">
  <xsd:sequence>
    <xsd:element ref="Name"></xsd:element>
    <xsd:all>
      <xsd:element ref="ADD"></xsd:element>
      <xsd:element ref="DELETE"></xsd:element>
    </xsd:all>
  </xsd:sequence>
</xsd:complexType>

私の質問は、上記の「ADD」要素と「DELETE」要素を任意の順序(順序なしのセット)で宣言する方法ですが、要素「Name」が最初で常に表示されることを確認してください。 (「ADD」と「DELETE」だけでなく、約10個以上の順序付けられていない要素(ADD、DELETE、EDITなど)が設定されている状況を考えてみてください。)

重要な注意:ADDとDELETEは1回だけ表示される場合がありますが、順序は重要ではありません。

<Application>
  <NAME>
   <DELETE>
   <ADD>
</Application>

だがしかし:

<Application>
  <NAME>
  <DELETE>
  <ADD>
  <DELETE> <!--cannot appear twice-->
</Application>
20
ogee

私があなたの要求が順調に進んでいることを理解しているなら、あなたが見逃しているのはあなたの選択のmaxOccurs = "unbounded"だけです。

次のスキーマを作成しました。

<?xml version="1.0"?>
<xs:schema targetNamespace="http://someNamespace" xmlns="http://someNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root" type="Application">
  </xs:element>

  <xs:complexType name="Application">
    <xs:sequence>
      <xs:element ref="Name"></xs:element>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="ADD"></xs:element>
        <xs:element ref="DELETE"></xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Name"/>
  <xs:element name="ADD"/>
  <xs:element name="DELETE"/>
</xs:schema>

そしてそれはうまくいきました

<ns0:Root xmlns:ns0="http://someNamespace">
  <ns0:Name />
  <ns0:ADD />
  <ns0:ADD />
  <ns0:DELETE />
  <ns0:ADD />
  <ns0:DELETE />
  <ns0:DELETE />
</ns0:Root>

しかし、

<ns0:Root xmlns:ns0="http://someNamespace">
  <ns0:ADD />
  <ns0:ADD />
  <ns0:DELETE />
  <ns0:ADD />
  <ns0:DELETE />
  <ns0:DELETE />
</ns0:Root>
17
Yossi Dahan

この問題で7年間苦労していて、答えがないのが残念です。

私はあなたの仮定を再考することによって助けるつもりです。

「名前」を最初に来る必要のあるデータとして扱い、アプリケーションの子である必要があることを要求し、一般にその兄弟の順序は気にしないと言うことで、混乱した状況になりますあなた自身のための。 Nameが異なるルールに従い、異なる目的を果たすのに、なぜADDとDELETEの兄弟であるのですか?これを他のデータ構造でモデル化する必要がある場合は、「ADD」と「DELETE」の横のリストに「Name」を含めないでください。アプリケーションには名前があり、ADDやDELETEなどのコマンドのリストもあります。

Nameは、ADDやDELETEと比較して特別なものであるため、他のタグとは別にモデル化する必要があります。

したがって、NameをApplicationの属性にして、AddとDeleteを子要素として保持するか、Nameを子要素として保持してから、ADDとDELETEをコマンドなどのプレースホルダー/グループ化タグで囲むことができます。コマンドタグは、名前の唯一の兄弟になります。

これは、Nameを属性としてサポートし、任意の数のコマンドを任意の順序で使用できるスキーマです。 "Attribute.xsdとしての名前":

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Application" type="Application_Type" />
    <xs:complexType name="Application_Type">
            <xs:all>
                <xs:element minOccurs="0" ref="ADD"/>
                <xs:element minOccurs="0" ref="DELETE"/>
                <xs:element minOccurs="0" ref="THIRD"/>
                <xs:element minOccurs="0" ref="FOURTH"/>
            </xs:all>
            <xs:attribute name="Name"/>
    </xs:complexType>
    <xs:element name="ADD"/>
    <xs:element name="DELETE"/>
    <xs:element name="THIRD"/>  
    <xs:element name="FOURTH"/> 
</xs:schema>

XMLの例:

<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="text" xsi:noNamespaceSchemaLocation="Name as Attribute.xsd">
    <THIRD>text</THIRD>
    <ADD>text</ADD>
    <FOURTH>text</FOURTH>
    <DELETE>text</DELETE>
</Application>

これは、プレースホルダータグ内にコマンドがネストされているものです。 "コマンドGrouping.xsd":

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Application" type="Application_Type"/>
    <xs:complexType name="Application_Type">
        <xs:sequence>
            <xs:element ref="Name"/>
            <xs:element name="Commands" type="Commands_Type"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Commands_Type">
        <xs:all>
            <xs:element minOccurs="0" ref="ADD"/>
            <xs:element minOccurs="0" ref="DELETE"/>
            <xs:element minOccurs="0" ref="THIRD"/>
            <xs:element minOccurs="0" ref="FOURTH"/>
        </xs:all>
    </xs:complexType>
    <xs:element name="Name"/>
    <xs:element name="ADD"/>
    <xs:element name="DELETE"/>
    <xs:element name="THIRD"/>
    <xs:element name="FOURTH"/>
</xs:schema>

XMLの例:

<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Commands Grouping.xsd">
    <Name>text</Name>
    <Commands>
        <THIRD>text</THIRD>
        <ADD>text</ADD>
        <FOURTH>text</FOURTH>
        <DELETE>text</DELETE>
    </Commands>
</Application>

これらのいずれかに関する1つの注意点は、コマンドがゼロのメッセージは引き続き有効なメッセージであるということです。おそらくそれは問題ありませんが、それが問題である場合は、検証がXSDではなくアプリケーション層に属している可能性があります。

5
James Daily

私はあなたが「すべて」の要素を探していると思います、それは順序付けられていないリストを可能にします。ただし、そこに配置できる要素には制限があります。 http://www.w3.org/2005/07/xml-schema-patterns.html#Collection を参照してください。

4

ADD、DELETEなどのすべての組み合わせを列挙せずにこれを実行できるとは思いません。一般的に、順序付けされていないリストは、DTDまたはスキーマのいずれでもうまく機能しません。

3
Alohci

シーケンスタイプxs:choiceを使用して、順序なしリストを実装できます。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Application"/>
  <xs:complexType>
   <xs:element name="NAME">
    <xs:sequence>
     <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="ADD" type="xs:string"/>
      <xs:element name="DELETE" type="xs:string"/>
     </xs:choice>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

このようにして、ユーザーが<NAME/>要素内で必要なタグを使用することを制限しますが、ユーザーが<ADD/>および<DELETE/>を好きなだけ使用できるようにします。

1
Daniel Lee