2011-12-08 10 views
0

文字列のキーと値のペアのツリーに対してXSDを構築したいと思います。これに合わせて 何か:文字列のキーと値のペアのツリーのXSD

この代替パターン:

<entry> 
    <key>root</key> 
    <entry> 
     <key>name</key> 
     <value>john</value> 
    </entry> 
    <entry> 
     <key>address</key> 
     <entry> 
     <key>street</key> 
     <value>Rou de Flon 1</value> 
     </entry> 
     <entry> 
     <key>city</key> 
     <value>Lausanne</value> 
     </entry> 
    </entry> 
</entry> 

<entry> 
    <key>root</key> 
    <entry key="name">john</entry> 
    <entry key="address"> 
     <entry key="street">Rou de Flon 1</entry> 
     <entry key="city">Lausanne</entry> 
    </entry> 
</entry> 

私はこの(::文字列ではなく、XSD anyTypeを私はXSDを使用する)を取得するために管理していませんでした

はで行うことができます。

<xsd:complexType name="Entry"> 
    <xsd:sequence> 
     <xsd:element name="key" type="xsd:string"/> 
     <xsd:choice> 
     <xsd:element name="value" type="xsd:string"/> 
     <xsd:element name="entry" maxOccurs="unbounded" type="rbo:Entry"/> 
     </xsd:choice> 
    </xsd:sequence> 
    </xsd:complexType> 

が、私は最初のパターンを使用することを好むだろう、それ理由よりコンパクトです。

<xsd:complexType name="ValueEntry"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="key" use="required" type="xsd:string"/> 
     </xsd:extension> 
    </xsd:simpleContent> 
    </xsd:complexType> 

    <xsd:complexType name="ListEntry"> 
    <xsd:sequence> 
     <xsd:element name="entry" maxOccurs="unbounded" type="rbo:ListOrValueEntry"/> 
    </xsd:sequence> 
    <xsd:attribute name="key" use="required" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="ListOrValueEntry"> 
    <xsd:sequence> 
     <xsd:choice> 
     <xsd:element name="value" type="rbo:ValueEntry"/> 
     <xsd:element name="entry" type="rbo:ListEntry"/> 
     </xsd:choice> 
    </xsd:sequence> 
    </xsd:complexType> 

が、それはより醜いXML生成します:

は、私は、この他のXSDしようとしたので、

<listEntry> 
    <entry> 
    <value key="name">john</value> 
    </entry> 
    <entry> 
    <entry key="address"> 
     <entry> 
     <value key="street">Rou de Flon 1</value> 
     </entry> 
     <entry> 
     <value key="city">Lausanne</value> 
     </entry> 
    </entry> 
    </entry> 
</listEntry> 

を、XSDを使用せずに、このパターンのXSDを作成する方法があります:anyTypeを?

<entry> 
    <key>root</key> 
    <entry key="name">john</entry> 
    <entry key="address"> 
     <entry key="street">Rou de Flon 1</entry> 
     <entry key="city">Lausanne</entry> 
    </entry> 
</entry> 

ps:どうかこのパターンが好きかどうかは議論しないでください。それはすばらしい議論ですが、この投稿の目的ではありません。 この投稿の目的は、xsd:anyTypeを使用せずに、できるだけこのXMLのためのXSDを書く方法を見つけることです。

答えて

3

文字列要素と非文字列要素に異なるタグ名を使用する必要があります。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="entry" type="entryType"/> 
    <xs:complexType name="entryType"> 
     <xs:choice maxOccurs="unbounded"> 
      <xs:element type="valueType" name="value"/> 
      <xs:element type="entryType" name="entry"/> 
     </xs:choice> 
     <xs:attribute type="xs:string" name="key"/> 
    </xs:complexType> 
    <xs:complexType name="valueType"> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute type="xs:string" name="key"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:schema> 

しかし、それはXMLです:ほとんどの近い構造は、そのための

<entry key="root"> 
    <value key="name">john</value> 
    <entry key="address"> 
     <value key="street">Rou de Flon 1</value> 
     <value key="city">Lausanne</value> 
    </entry> 
</entry> 

スキーマは次のようになります。

<root> 
    <name>john</name> 
    <address> 
    <street>Rou de Flon 1</street> 
    <city>Lausanne</city> 
    </address> 
</root> 
+0

文字列と非文字列の要素に異なるタグ名を使用するオプションを試しましたが、そのためにXSDを構築するためにmanagetしませんでした。それは私が投稿に含まれている大きなXSDで試していたものでしたが、投稿で言及している "醜いXML"を生成します。 あなたの例で有効なXSDを構築する方法を知っていますか? –

+0

"もっと読みやすくなるだろう..."と私は同意します。これがXMLとXSDの目的です。しかし、プロジェクトの特定の理由から、あらかじめ定義されていない文字列の値とキーのペアのツリーが必要です。 –

+0

XMLのXSDを追加しました。また、あらかじめ定義されていないペアのツリーが必要な場合は、XMLとまったく同じです。 XSDで「定義されていない定義」のポイントは何ですか? – kan

0

Entryの定義に混在したコンテンツを使用する必要があります。また、minOccurs = "0"が必要です。

<xsd:complexType name="Entry" mixed="true"> 
    <xsd:sequence> 
    <xsd:element name="key" minOccurs="0" type="xsd:string" /> 
    <xsd:element name="entry" minOccurs="0" maxOccurs="unbounded" type="Entry"/> 
    </xsd:sequence> 
    <xsd:attribute name="key" type="xsd:string" /> 
</xsd:complexType> 

これにより、必要な構造を正確に設定することができます。

+0

これは ' aaaa bbb ccc'のようなものを許可します。私が理解するように、彼が望んでいるものではありません。 – kan

+0

コードサンプルを変更しましたので、上部の余分な "キー"要素をサポートします。だから彼は彼が望む正確な構造を持つことができます。 –

+0

私は、 'mixed = true'はミックスタグとテキストを許すことを意味します。しかし、彼は、(IIUC)タグだけ、またはテキストだけを持ち、一緒にではない要素を望んでいます。 – kan

関連する問題