使用嵌套元素从 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。
我想从 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。