Xsd,无法在命名空间中解析的元素

时间:2014-08-20 12:05:34

标签: xml xsd wsdl xsd-validation

在xsd中,我包含并导入一些元素。 导入的一个未解决,我收到此错误:

错误:src-resolve:无法将名称'crq1:CoverageRequest'解析为(n)'类型定义'组件。

OfferRequest.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/Test4"
        xmlns:crq1="http://www.example.org/CoverageRequestOffer"
        xmlns:tns="http://www.example.org/Test4">

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

        <xsd:include schemaLocation="OfferScope.xsd"/>
        <xsd:include schemaLocation="OfferConstraints.xsd"/>
        <xsd:include schemaLocation="PricingConstraints.xsd"/>

        <xsd:element name="OfferRequest">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="Configuration" type="tns:OfferScope" />
                    <xsd:element name="Coverage" type="crq1:CoverageRequest" />  <!-- ***** error ***** -->
                    <xsd:element name="ResponseConstraints" type="tns:OfferConstraints"/>
                    <xsd:element name="RequestConstraints" type="tns:PricingConstraints"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>

CoverageRequestOffer.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:tns="http://www.example.org/Test4"
        targetNamespace="http://www.example.org/CoverageRequestOffer"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">

        <xsd:import namespace="http://www.example.org/Test4"
            schemaLocation="TypeOfVehicule.xsd" />

        <xsd:import namespace="http://www.example.org/Test4"
            schemaLocation="Insured.xsd" />

        <xsd:import namespace="http://www.example.org/Test4"
            schemaLocation="TypeOfCoverageCategory.xsd" />

        <xsd:element name="CoverageRequest">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="PurchaseDate" type="xsd:dateTime" />
                    <xsd:element name="StartDate" type="xsd:dateTime" />
                    <xsd:element name="EndDate" type="xsd:dateTime" />
                    <xsd:element name="VehicleCategory" type="tns:TypeOfVehicule" />
                    <xsd:element name="TravelDestination" type="xsd:string"
                        minOccurs="0" maxOccurs="255" />
                    <xsd:element name="DiscountCodes" type="xsd:string"
                        maxOccurs="unbounded" minOccurs="0" />
                    <xsd:element name="DeductibleCode" type="xsd:string"
                        minOccurs="0" maxOccurs="25" />
                    <xsd:element name="ProvinceOfResidence" type="xsd:string"
                        minOccurs="1" maxOccurs="255" />
                    <xsd:element name="Insured" type="tns:Insured"
                        minOccurs="1" />
                    <xsd:element name="CoverageCategory" type="tns:TypeOfCoverageCategory" />
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>

在命名空间中:http://www.example.org/Test4,存在CoverageRequest类型。

有任何解决此错误的信息吗?

2 个答案:

答案 0 :(得分:1)

您指的是名为“crq1:CoverageRequest”的类型,但只有一个具有该名称的元素。

换句话说,解析器正在寻找像

这样的东西
<xsd:complexType name="CoverageRequest">

但你有

<xsd:element name="CoverageRequest">

答案 1 :(得分:1)

ErikSjölund已经指出了问题的直接原因。

有两种可能的解决方法:

  • 将名为CoverageRequest的复杂类型的声明添加到名称空间http://www.example.org/CoverageRequestOffer的模式文档中(如果您控制该模式文档)。

    或者(假设您想要的类型是CoverageRequest元素的类型)将复杂类型移出CoverageRequest元素声明,因此架构的相关部分显示为:

    <xsd:element name="CoverageRequest" 
                 type="tns:CoverageRequest"
                 xmlns:tns="http://www.example.org/CoverageRequestOffer">
    
    <xsd:complexType name="CoverageRequest">
      <xsd:sequence>
        <xsd:element name="PurchaseDate" type="xsd:dateTime" />
        <xsd:element name="StartDate" type="xsd:dateTime" />
        ...
      </
    </
    
  • 更改名称空间http://www.example.org/Test4的架构,不是引用类型,而是引用元素。

    具体来说,在元素OfferRequest的声明中,更改

    <xsd:element name="Coverage" type="crq1:CoverageRequest" />
    

    <xsd:element ref="crq1:CoverageRequest" />
    

    这不完全相同,因为您的XML现在需要有一个名为crq1:CoverageRequest(或等效物)的元素作为OfferRequest的第二个子元素,而不是名为test4:Coverage的元素(或相当于)。但是,如果您不控制名称空间http://www.example.org/CoverageRequestOffer的架构文档,那么它可能是最好的选择。