这是XSD实施中的错误吗?为什么这不起作用?

时间:2009-08-27 09:39:51

标签: xml xsd

我有一个xsd文件,我宁愿不修改(Exceptions.xsd):

<xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns="http://me.com/Exceptions.xsd" 
        targetNamespace="http://me.com/Exceptions.xsd" 
        elementFormDefault="qualified" 
        attributeFormDefault="unqualified"
>
    <xs:element name="Exception" type="ExceptionType" />

    <xs:complexType name="ExceptionType">
        <xs:sequence>
            <xs:element name="Code" type="xs:string" minOccurs="0"/>
            <xs:element name="Message" type="xs:string"/>
            <xs:element name="TimeStamp" type="xs:dateTime"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

我想创建一个新元素,其他名称实现ExceptionType(ExceptionsExtensions.xsd - Alternative 1)。

<xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns="http://me.com/Exceptions.xsd" 
        targetNamespace="http://me.com/Exceptions.xsd" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=
                " 
                http://me.com/Exceptions.xsd Exceptions.xsd
                "
        elementFormDefault="qualified" 
        attributeFormDefault="unqualified">

    <xs:element name="SpecificException" type="ExceptionType" />
</xs:schema>

我收到错误消息:未声明类型“http://me.com/Exceptions.xsd:ExceptionType”。

但是,如果我这样做(ExceptionExtensions.xsd - Alternative 2):

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://me.com/Exceptions.xsd" 
    targetNamespace="http://me.com/Exceptions.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
            " 
            http://me.com/Exceptions.xsd Exceptions.xsd
            "
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">

    <xs:element name="SpecificException">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="innerException">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:any namespace="http://me.com/Exceptions.xsd" />                         
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

我可以验证

<?xml version="1.0" encoding="utf-8"?>
<SpecificException xmlns="http://me.com/Exceptions.xsd">
    <innerException>
        <Exception>
            <Code>12</Code>
            <Message>Message</Message>
            <TimeStamp>2009-08-27T11:30:00</TimeStamp>
        </Exception>
    </innerException>
</SpecificException>

因此在备选方案1中,它找不到在Exceptions.xsd中声明的ExceptionType,但在备选方案2中,它可以找到在Exceptions.xsd中声明的Exception-element。

为什么备选方案1不起作用?

亲切的问候, Guillaume Hanique

1 个答案:

答案 0 :(得分:3)

在“备选方案1”中,您引用了“ExceptionType” - 但它未在该文件中的任何位置声明。

仅仅因为两个文件共享相同的命名空间并不意味着文件A可以依赖于文件B中的内容 - 您需要连接两个!

在您的第二个文件中添加<xsd:include>

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://me.com/Exceptions.xsd" 
    targetNamespace="http://me.com/Exceptions.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://me.com/Exceptions.xsd Exceptions.xsd"
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">

  <xs:include schemaLocation="exceptiontype.xsd"/>

  <xs:element name="SpecificException" type="ExceptionType" />
</xs:schema>

这应该可以做到!

马克