如果您的数据不是完全免费的格式,我会让 XML 特定于您的数据模型:
<contact>
<home>
<tel>
<area>910</area>
<num>1234 5678</num>
</tel>
</home>
<work>
<tel>
<area>701</area>
<num>8888 8888</num>
</tel>
<fax>
<area>701</area>
<num>9999 9999</num>
</fax>
</work>
</contact>
但是,假设您有理由按照您的方式进行操作(例如,假设您的数据确实是完全自由格式的结构化数据),您可以通过执行类似的操作使 XSD 更清晰一点这:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="object">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="string"/>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="string">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
我更喜欢每个element
都以独立方式定义的模式——尽可能多地——并且在多个地方使用的任何类型也被单独定义。在您的情况下,没有重用类型。
当 XSD 嵌套很深时,它会变得更难阅读,也更难支持和修改。
注意:您可以通过进行以下更改使对象名称可选:
<xs:element name="object">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="string"/>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
但也不要将字符串类型上的名称设为可选!(至少从您向我们展示的内容来看,这样做没有意义。)