XSD混淆:导入和/或包含

时间:2011-03-23 19:26:58

标签: xml xsd

我有几个小的xsd文件因为重复而被剥离了。我认为如果类型改变我可以减少维护。所以这是一个例子:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:simpleType name="StartCodeType">
        <xs:restriction base="xs:integer">
            <xs:pattern value="99[0-9]{3,6}"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

现在我有一个试图像这样包含这个文件的xsd:

<?xml version="1.0"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.quikq.com/xsd/unlukupRequest" 
    xmlns="http://www.quikq.com/xsd/unlukupRequest"
    elementFormDefault="qualified" >

    <xs:include schemaLocation="TrimmedStringType.xsd" />
    <xs:include schemaLocation="StartCodeType.xsd" /> 
    <xs:include schemaLocation="AscendDescendFlag.xsd" /> 

(等)

我的程序使用Xerces SAX2来解析XML。这是我得到的错误:

  

文件错误“/home/dfcuser/unlukupRequest.xsd”,line = 32,column = 69,XML element =,http://www.quikq.com/xsd/unlukupRequest:StartCodeType中找不到类型

     

文件错误“/home/dfcuser/unlukupRequest.xsd”,line = 34,column = 87,XML element =,http://www.quikq.com/xsd/unlukupRequest:TrimmedStringType中找不到类型

     

文件错误“/home/dfcuser/unlukupRequest.xsd”,line = 38,column = 68,XML element =,找不到基本类型:TrimmedStringType

     

文件“/home/dfcuser/unlukupRequest.xsd”,line = 50,column = 108,XML element =,SimpleType(http://www.quikq.com/xsd/unlukupRequest:AscendDescendFlag)属性错误: ad_flag未找到

无论如何,我认为这可行,因为我的'类型'没有定义命名空间。

这是XSD

<?xml version="1.0"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.quikq.com/xsd/unlukupRequest" 
    xmlns="http://www.quikq.com/xsd/unlukupRequest"
    elementFormDefault="qualified" >

    <!--
        Homebrewed data types for more strict checking on different fields 
    -->
    <xs:include schemaLocation="StartCodeType.xsd" /> 
    <xs:include schemaLocation="TrimmedStringType.xsd" />
    <xs:include schemaLocation="AscendDescendFlag.xsd" /> 

    <!-- 
        Describes the root element 
    -->
    <xs:element name="unlukupRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="transaction" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!--
        Describes the response element, which is the child to the authNotifyResponse root
    -->
    <xs:element name="transaction">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="startCode" type="StartCodeType" />
                <xs:element name="ununit" type="xs:string" minOccurs="0" />
                <xs:element name="exception" type="TrimmedStringType" minOccurs="0" />
                <xs:element name="opt" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="TrimmedStringType">
                                <xs:attribute name="name" type="xs:NMTOKEN" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
                <xs:element name="orderBy" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="field" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:attribute name="name"    type="xs:NMTOKEN"        use="required" />
                                    <xs:attribute name="ad_flag" type="AscendDescendFlag" use="required" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="rangeLower" type="xs:integer" minOccurs="0" />
                <xs:element name="rangeUpper" type="xs:integer" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

1 个答案:

答案 0 :(得分:0)

您提供的XSD驱动程序文件似乎是合法的;当我在本地保存它和你的StartCodeType.xsd文件时,它们的行为与预期的一样。我的猜测是因为我无法猜测Xerces没有找到包含的文件。

如果您在包含的架构文档中注入语法或其他错误,Xerces会抱怨它们吗? (如果没有,也许它不是在阅读它们;这可以解释为什么它找不到类型定义。)

如果您在包含的架构文档中显式提供目标命名空间,而不是依赖于chameleon include,那会改变行为吗?