【问题标题】:XSD: Importing complex types doesn't workXSD:导入复杂类型不起作用
【发布时间】:2012-05-12 13:29:52
【问题描述】:

我有一个 XML 架构 schema.xsd,在外部文件 types.xsd 中有自定义类型。我不知道为什么我的复杂类型 typeComplex 没有正确验证。像typeSimple 这样的简单类型可以正常工作。这有什么问题?

Eclipse 说:

cvc-complex-type.2.4.a:发现无效内容以 元素'a'。应该是 '{"http://www.example.org/types":a}' 之一。

schema.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/schema" elementFormDefault="qualified"
    xmlns:t="http://www.example.org/types">

    <xs:import schemaLocation="types.xsd" namespace="http://www.example.org/types" />

    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="simple" type="t:typeSimple" />
                <xs:element name="complex" type="t:typeComplex" />
            </xs:all>
        </xs:complexType>
    </xs:element>

</xs:schema>

types.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/types" xmlns="http://www.example.org/types"
    elementFormDefault="qualified">

    <xs:simpleType name="typeSimple">
        <xs:restriction base="xs:string">
            <xs:length value="3" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="typeComplex">
        <xs:sequence>
            <xs:element name="a" type="xs:string" />
            <xs:element name="b" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

text.xml - 对 xsd 无效 - 为什么?

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.org/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/schema schema.xsd " xmlns:t="http://www.example.org/types">
    <simple>XXX</simple>
    <complex>
        <a></a> <!-- not valid here; Eclipse say: cvc-complex-type.2.4.a: Invalid content was found starting with element 'a'. One of '{"http://www.example.org/types":a}' is expected. -->
        <b></b>
    </complex>
</root>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    您的实例文档被声明为命名空间“http://www.example.org/schema”内的“根”类型的实例。这可以。在本文档中,您希望使用命名空间“http://www.example.org/types”中的类型,因此您已将这个命名空间包含在前缀中。这也不错。

    但是,当您使用“http://www.example.org/types”命名空间中包含的类型时,您会忽略您在 xmlns 声明中定义的前缀。

    引用这些类型的正确方法:

    <root xmlns="http://www.example.org/schema" 
          xmlns:t="http://www.example.org/types">
      <simple>XXX</simple>
      <complex>
        <t:a></t:a>
        <t:b></t:b>
      </complex>
    </root>
    

    更新

    你的选择是:

    使用非限定类型 - 只需将架构定义更改为 elementFormDefault="unqualified"。这意味着您现在可以这样做:

    <root xmlns="http://www.example.org/schema">
      <simple xmlns="">XXX</simple>
      <complex xmlns="">
        <a></a>
        <b></b>
      </complex>
    </root>
    

    或者,不要使用 XSD 架构。这意味着您可以只使用格式良好的 xml:

    <root>
      <simple>XXX</simple>
      <complex>
        <a></a>
        <b></b>
      </complex>
    </root>
    

    【讨论】:

    • 不使用t:命名空间可以吗?我需要经过验证的 xml 将位于一个命名空间中。
    【解决方案2】:

    我想使用&lt;xs:include /&gt;

    schema.xsd:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/schema" elementFormDefault="qualified">
    
        <xs:include schemaLocation="types.xsd" />
    
        <xs:element name="root">
            <xs:complexType>
                <xs:all>
                    <xs:element name="simple" type="typeSimple" />
                    <xs:element name="complex" type="typeComplex" />
                </xs:all>
            </xs:complexType>
        </xs:element>
    
    </xs:schema>
    

    types.xsd:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    
        <xs:simpleType name="typeSimple">
            <xs:restriction base="xs:string">
                <xs:length value="3" />
            </xs:restriction>
        </xs:simpleType>
    
        <xs:complexType name="typeComplex">
            <xs:sequence>
                <xs:element name="a" type="xs:string" />
                <xs:element name="b" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
    

    【讨论】:

    • 非常感谢! ` ` 而不是 &lt;xs:import ... /&gt; 也解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多