Xml 使用XSD对元素进行更干净的扩展
我定义的xml模式包含一个名为“field”的元素和一个名为“composite field”的扩展。 其定义如下:Xml 使用XSD对元素进行更干净的扩展,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我定义的xml模式包含一个名为“field”的元素和一个名为“composite field”的扩展。 其定义如下: <xs:complexType name="field"> <xs:sequence> <xs:element name="value" type="xs:string" /> </xs:sequence> </xs:complexType> <x
<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中使用它,ut必须:
<field xsi:type="composite-Field">
<value>enjoy</value>
<length>30</length>
</field>
享受
30
我不希望我的XML用户使用模式语法,例如xsi:type=…”因此,我的问题是:有没有办法使XML的语法:
<composite-Field>
<value>enjoy</value>
<length>30</length>
</composite-Field>
享受
30
因此,元素的名称将暗示其继承性,不会强制用户添加type属性?我试过这个:
<xs:element name="MyCompositeField" type="composite-field"/>
然后:
<MyCompositeField>
<value>enjoy</value>
<length>30</length>
</MyCompositeField>
享受
30
但它也没有通过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 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>
所需的xml如下所示:
<?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 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>
享受
30
使用此组合,我得到了错误消息的响应:
cvc复杂类型.2.4.a:无效
找到的内容以开头
元素“MyCompositeField”。什么之中的一个
应为“{field}”
您的问题更新显示真正的问题在
元素中。一份有效的文件是
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
这个模式定义创建了一个允许可选长度元素的类型,从而验证这两个文档
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
享受
及
享受
30
上下文是什么?您在哪里以及如何使用该模式?我编辑了我的答案以回应您的评论。抱歉,等待时间太长,我已脱机。您的编辑显示了一个新问题,因此我现在再次更新了我的答案。自从您重新定义了问题之后,我有另一个更新。否,这不是解决方案。将type=“composite field”更改为“composite field”,仍然无法在xml中使用此元素。尝试时,我收到了错误消息:“cvc complex type.2.4.a:发现以元素“composite Field”开头的内容无效。应为“{Field}”中的一个”。嗨,jasso,我看到了您的答案并编辑了我的问题,以便您可以重现我提出的问题。谢谢大家…但我希望“general”元素能够包含“field”或“composite field”。不要严格要求它只有其中一种类型。这就是扩展元素的要点。
<?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>
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
<?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>
<xs:element name="general">
<xs:complexType>
<xs:choice>
<xs:element name="field" type="field" />
<xs:element name="MyCompositeField" type="composite-Field" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:complexType name="field">
<xs:sequence>
<xs:element name="value" type="xs:string" />
<xs:element name="length" type="xs:integer" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
<length>30</length>
</field>
</general>