Xml 使用XSD对元素进行更干净的扩展

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

我定义的xml模式包含一个名为“field”的元素和一个名为“composite field”的扩展。 其定义如下:

<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>