2017-07-05 22 views
1

私は以下の例のような再帰的な要素を持つXMLを持っています。 AはB要素のシーケンスを含みます。各B要素にはC、D、E、F要素が含まれています。シーケンスの最後のものを除く各FはB要素を含む。再帰的なXMLスキーマの生成

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<A> 
    <B> 
    <C></C> 
    <D></D> 
    <E></E> 
      <F> 
      <B> 
       <C></C> 
       <D></D> 
       <E></E> 
        <F> 
         <B> 
         <C></C> 
         <D></D> 
         <E></E> 
         <F></F> 
         </B> 
        </F> 
      </B> 
     </F> 
    </B> 
</A> 

オンラインジェネレータを使用してこのxmlのスキーマを生成すると、本当に長いスキーマファイルが作成されます。このxmlの短い再帰スキーマを書く方法はありませんか?再帰的なスキーマを書き込むことができます。もちろん、

enter image description here

答えて

2

シーケンスの最後の要素を除く各要素FにB要素が含まれている場合は、次のスキーマを使用できます。 選択構造を使用することによって、最後のF要素を再帰的にすることはできません。 このスキーマは正しく検証されますが、それが優良なソリューションであるかどうかはわかりません。

<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="A"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="B" type="B" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="F" type="B"/> 
    <xsd:complexType name="B"> 
    <xsd:sequence> 
     <xsd:element name="C" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="D" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="E" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
     <xsd:choice> 
     <xsd:element ref="F" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="F" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
     </xsd:choice> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 
+0

ありがとう、ありがとう。 – bez

0

。インスタンス文書には、それを正確に記述するために使用できるスキーマがいくつでもありますが、自動スキーマ生成プログラムにとって難しいのは、それをエレガントに記述するパターンを見つけることです。つまり、他のインスタンス文書を推測することです受け入れるスキーマ。

再帰的スキーマを書く典型的な方法は、名前付きグローバルタイプを使用することです(名前付きグローバルエレメント宣言でも可能ですが)。次のようなものがあります:

関連する問題