这种XML最简单/最清晰的XSD样式是什么? (它来自this answer)
<object name="contact">
<object name="home">
<object name="tel">
<string name="area" value="910"/>
<string name="num" value="1234 5678"/>
</object>
</object>
<object name="work">
<object name="tel">
<string name="area" value="701"/>
<string name="num" value="8888 8888"/>
</object>
<object name="fax">
<string name="area" value="701"/>
<string name="num" value="9999 9999"/>
</object>
</object>
</object>
编辑我将我的示例XSD和澄清移动到答案中。
答案 0 :(得分:2)
如果您的数据不是完全免费的格式,我会根据您的数据模型制作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>
但是也不要让字符串类型的名称可选! (至少从您向我们展示的内容来看,这样做是没有意义的。)
答案 1 :(得分:0)
这是一个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 name="string">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
XML的基本思想是嵌套对象:
V --> string | O // a Value is a string or an Object
O --> (K V)* // an Object is list of named values (Key-Value pairs)
但它略有不同,因为根始终是一个Object(不是字符串),它本身也被命名(即使它不在另一个Object中):
O ==> (string K | O)* K
我愿意稍微改变格式本身,以提供不同的XML,如果这样可以使XSD变得更简单/更清晰。如果一个Object总是有一个名字,这将删除特殊情况,这使得语法和XSD更加规则 - 更简单。因此,对象总是有一个名称似乎更简单。
澄清:特殊情况是,当Object是根时,它没有被命名,但在所有其他情况下,它被命名。这需要一个额外的标题部分,如下所示:
O'==> (string K | O)*
O ==> (string K | O)* K
处理这种特殊情况比原始情况更复杂,即使在重构时也要最小化这种复杂性:
F ==> (string K | O)*
O ==> F K