我定义了 xml 模式,其中包含一个名为“字段”的元素和一个名为“复合字段”的扩展。它定义如下:
<xs:complexType name="field">
<xs:sequence>
<xs:element name="value" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="composite-Field">
<xs:complexContent>
<xs:extension base="field">
<xs:sequence>
<xs:element name="length" type="xs:integer" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
为了在我的 XML 中使用它,必须是:
<field xsi:type="composite-Field">
<value>enjoy</value>
<length>30</length>
</field>
我不希望我的 XML 用户使用模式语法,例如xsi:type=..." "
因此我的问题是:有没有办法使 XML 的语法成为:
<composite-Field>
<value>enjoy</value>
<length>30</length>
</composite-Field>
所以元素的名称将暗示它的继承性并且不会强制用户添加类型属性?
我试过这个:
<xs:element name="MyCompositeField" type="composite-field"/>
接着:
<MyCompositeField>
<value>enjoy</value>
<length>30</length>
</MyCompositeField>
但它也没有通过 XSD 架构验证
2010 年 9 月 12 日:作为对建议答案的回应,我稍微细化了我的问题。
架构如下所示:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="general">
<xs:complexType>
<xs:sequence>
<xs:element name="field" type="field" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="field">
<xs:sequence>
<xs:element name="value" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="composite-Field" >
<xs:complexContent>
<xs:extension base="field" >
<xs:sequence>
<xs:element name="length" type="xs:integer" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MyCompositeField" type="composite-Field"/>
</xs:schema>
所需的 xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
<MyCompositeField>
<value>enjoy</value>
<length>30</length>
</MyCompositeField>
</general>
使用这种组合,我得到了错误消息的响应:
cvc-complex-type.2.4.a:发现以元素“MyCompositeField”开头的无效内容。需要“{field}”之一。