什么 xsd 会让一个元素无限地将自己作为子元素? [英] What xsd will let an element have itself as a sub element infinitely?
问题描述
我怎样才能创建一个 xsd 来给我这种可以无限运行的 xml 结构?
How can I create an xsd to give me this type of xml structure that can go on infinitely?
<?xml version="1.0" encoding="utf-8" ?>
<SampleXml>
<Items>
<Item name="SomeName" type="string">
This would be the value
</Item>
<Item name="SecondName" type="string">
This is the next string
</Item>
<Item name="AnotherName" type="list">
<Items>
<Item name="SubName" type="string">
A string in a sub list
</Item>
<Item name="SubSubName" type="list">
<Items>
<Item name="HowDoI" type="string">
How do I keep this going infinately?
</Item>
</Items>
</Item>
</Items>
</Item>
</Items>
</SampleXml>
我发现的唯一解决方案是在 xsd 中重复我愿意复制的次数.如下图.
The only solution I have found has been to just repeat in the xsd as many times as I am willing to copy. Like below.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SampleXml">
<xs:complexType>
<xs:sequence>
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Item">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Item">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element name="Item">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
推荐答案
使用
递归引用元素.一个简单的例子:
Use <xs:element ref="bla" />
to recursively refer to the elements.
A simple example:
<xs:element name="recursive">
<xs:complexType>
<xs:sequence>
<xs:element ref="recursive" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
允许你写这个:
<recursive>
<recursive>
<recursive />
</recursive>
<recursive />
<recursive>
<recursive>
<recursive />
</recursive>
</recursive>
</recursive>
'ref' 属性的使用也极大地有助于提高 XSD 的可读性.我会这样写你的:
Usage of the 'ref' attribute also helps greatly in increasing the readability of your XSD. This is how I would write yours:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SampleXml">
<xs:complexType>
<xs:sequence>
<xs:element ref="Items" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element ref="Item" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Item">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element ref="Items" minOccurs="0" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
请注意,即使在不是绝对必要的情况下(例如,当 SampleXml 引用项目时)使用 'ref' 时,如何使 XSD 减少嵌套混乱并提高可读性.
Note how use of 'ref' even when it's not strictly necessary (such as when SampleXml refers to Items) makes the XSD less of a nested mess and more readable.
这篇关于什么 xsd 会让一个元素无限地将自己作为子元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!