使用嵌套元素从XML创建XSD

时间:2016-03-23 10:39:42

标签: xml xsd

我想从XML文件创建一个XSD文件,但是我得到错误,因为有一个与上层元素同名的嵌套元素。 XML文件(部分)看起来像这样:

- <comments>
  - <generalCommentData>
    <createDate>2016-03-18T07:36:48.272+0100</createDate> 
    <message>Test1</message> 
    ...
  - <replies>
    - <generalCommentData>
      <createDate>2016-03-18T07:36:48.272+0100</createDate> 
      <message>Test2</message> 
      ...
      <replies />
      </generalCommentData>
      ...
    </replies>
    </generalCommentData>
  </comments>

基本上这个XML显示了一些注释,其中可能包含一些回复注释(可以再次包含回复注释),但每个注释实际上都是generalCommentData

我能做些什么才能让事情奏效?我不习惯使用XML文件,我不知道该怎么做。我甚至不知道我是否正确解释了......

1 个答案:

答案 0 :(得分:2)

以下是与您的XML匹配的XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="comments" type="CommentsType"/>
    <xsd:complexType name="CommentsType">
        <xsd:sequence>
            <xsd:element name="generalCommentData" type="CommentsDataType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>      
    <xsd:complexType name="CommentsDataType">
        <xsd:all>
            <xsd:element name="createDate" type="xsd:dateTime"/>
            <xsd:element name="message" type="xsd:string"/>
            <xsd:element name="replies" type="CommentsType"/>
        </xsd:all>
    </xsd:complexType>
</xsd:schema>

需要注意的事项:

  • 您的XML似乎暗示xsd:dateTime应该有效。不幸的是,你错过了冒号,它应该是2016-03-18T07:36:48.272+01:00;如果确实,这就是数据的方式,那么将 xsd:dateTime 的使用更改为 xsd:string
  • 您正在寻找如何使用XSD建模递归结构。上面的XSD显示了一种方法,在我看来,这是你用样品显示的最紧凑的方式。关键点是:

    • 假设您的根元素的内容模型与回复的内容模型相同,则可以在两种情况下重用全局类型 CommentsType
    • 通过重用 CommentsType 来实现递归。
    • 您的示例XML似乎暗示回复元素是必需的。
    • 与大多数递归概念一样,期望算法/结构最终结束。在我的示例中,这是通过使 generalCommentData 可选来实现的。如果没有这个,就无法构建有效的XML。

如果您有不同的约束条件,例如您的评论元素必须至少有一个 generalCommentData 元素,然后您的架构必须更改。最简单的方法可能是确保回复元素是可选的(这自然是有意义的)。如果回复必须是强制性的,那么以下方法将起作用:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="comments">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="generalCommentData" maxOccurs="unbounded"/>
            </xsd:sequence>         
        </xsd:complexType>
    </xsd:element>      
    <xsd:element name="generalCommentData">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="createDate" type="xsd:dateTime"/>
                <xsd:element name="message" type="xsd:string"/>
                <xsd:element name="replies">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element ref="generalCommentData" minOccurs="0" maxOccurs="unbounded"/>
                        </xsd:sequence>         
                    </xsd:complexType>                  
                </xsd:element>
            </xsd:all>
        </xsd:complexType>      
    </xsd:element>
</xsd:schema>

此示例向您展示了实现递归结构的另一种方法,即通过元素引用,此处 generalCommentData

还有第三种方法,使用群组参考;如果你真的需要它,我会留给你找到它;只搜索递归的XML Schema。

最后,我使用 xsd:all 作为合成器。如果您需要订单或应重复的元素,请转而使用 xsd:sequence