使用嵌套元素从 XML 创建 XSD

Create XSD from XML with nested elements

我想从 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-Files,我不知道该怎么做。我什至不知道我是否解释正确...

下面的 XSD 与您的 XML 匹配:

<?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 似乎暗示 replies 元素是必需的。
    • 与大多数递归概念一样,人们期望 algorithm/structure 最终会结束。在我的示例中,这是通过使 generalCommentData 可选来实现的。否则,将无法构建有效的 XML.

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

<?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 模式。

最后一点,我使用 xsd:all 作为合成器。如果您需要顺序或应该重复的元素,请改用 xsd:sequence