2011-12-08 22 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