我想从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文件,我不知道该怎么做。我甚至不知道我是否正确解释了......
答案 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>
需要注意的事项:
2016-03-18T07:36:48.272+01:00
;如果确实,这就是数据的方式,那么将 xsd:dateTime 的使用更改为 xsd:string 您正在寻找如何使用XSD建模递归结构。上面的XSD显示了一种方法,在我看来,这是你用样品显示的最紧凑的方式。关键点是:
如果您有不同的约束条件,例如您的评论元素必须至少有一个 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 。