2011-12-08 23 views
0

我想爲字符串鍵值對的樹構建XSD。 的東西,以適應這一點:XSD字符串鍵值對的樹

<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:字符串,而不是XSD:anyType的)

這種替代模式:

<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> 

可以用:

<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:

<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:

<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:請不要討論你是否喜歡這種模式;這是一個很好的討論,但它不是這篇文章的目標。 這篇文章的目的是要找出如何儘可能爲這個XML編寫XSD,而不使用xsd:anyType。

回答

3

您應該爲字符串和非字符串元素使用不同的標籤名稱。最爲接近的結構將是

<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> 

模式:

<?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。更可讀的將是:

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

我試過對字符串和非字符串元素使用不同標籤名稱的選項,但我沒有爲它構建XSD。那正是我在用我包括在帖子中的大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

我已經更改了代碼示例,現在它將支持頂部額外的「key」元素。所以現在它確實允許他有他想要的確切結構。 –

+0

我的意思是'mixed = true'允許混合標籤和文本。但他希望(IIUC)只有標籤或只有文本的元素,而不是在一起。 – kan