我最近一直在研究符合ACORD P& C标准的Web服务,并且遇到了一些麻烦,因为wsimport错误地说它无法解析其中一个xsd文件。 错误消息是:
[ERROR] Unable to parse "D:\projects\DICACORD\DicAcordQuoteRq.xsd" : Illegal character in opaque part at index 2: D:\projects\DICACORD\DicAcordQuoteRq.xsd
我创建的模式基于ACORD P& C模式(超过23k行),我只包含了公司需要使用的必需元素。我使用XMLSpy创建了模式,并且根据其验证,模式是有效的,但是当我尝试在netbeans 6.8中创建Web服务时,我收到上面的错误消息。
模式在我的开发机器上,根据我在netbeans论坛上可以找到的内容,netbeans将wsdl复制到项目内部的一个目录中,这样当你将它从开发转移到生产时,一切仍然像它应该的那样工作
wsdl如下
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2010 -->
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="discoveryinsurance.com/schemas" xmlns:ns="discoveryinsurance.com/schemas/acordRq" xmlns:ns1="discoveryinsurance.com/schemas/acordRs" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="discoveryinsurance.com/schemas">
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRq" location="D:\projects\DICACORD\DicAcordQuoteRq.xsd"/>
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRs" location="D:\projects\DICACORD\DicAcordQuoteRs.xsd"/>
<wsdl:types>
<xs:schema targetNamespace="discoveryinsurance.com/schemas" elementFormDefault="qualified"/>
</wsdl:types>
<wsdl:message name="NewMessageRequest">
<wsdl:part name="parameter" element="ns:ACORD"/>
</wsdl:message>
<wsdl:message name="NewMessageResponse">
<wsdl:part name="parameter" element="ns1:ACORD"/>
</wsdl:message>
<wsdl:portType name="QuotePort">
<wsdl:operation name="QuoteRequest">
<wsdl:input name="quoteInput" message="tns:NewMessageRequest"/>
<wsdl:output name="quoteOutput" message="tns:NewMessageResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AgencyQuoteSOAP" type="tns:QuotePort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="QuoteRequest">
<soap:operation soapAction="urn:QuoteRequest" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="AgencyQuote">
<wsdl:port name="QuotePort" binding="tns:AgencyQuoteSOAP">
<soap:address location="http://localhost:8084/DicQuoteSvc/AgencyQuote"/>
</wsdl:port>
</wsdl:service>
我觉得这与命名空间有关,但我不确定。这也是我第一次尝试以这种方式创建Web服务,因为我认为我会节省一些开发时间。
我尝试使用Google搜索错误消息,我读过的所有内容都指向错误的URI。我认为XMLSpy的验证会捕获这样的错误,但如果这是问题,那么它就无法捕获它。
非常感谢任何帮助,我很乐意提供任何其他所需的信息。
答案 0 :(得分:7)
关于wsdl:import元素,WSDL 1.1规范says:
WSDL允许关联命名空间 使用文档位置 进口声明:
<definitions .... > <import namespace="uri" location="uri"/> * </definitions>
(...)
URI可能是绝对的或相对的,但您的无效。
当然,您可以尝试指定绝对URI,可能使用file://
和/或正斜杠。但在你的情况下,我认为你应该把你的XSD放在你的WSDSL旁边并使用相对URI,如下所示:
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRq" location="DicAcordQuoteRq.xsd"/>
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRs" location="DicAcordQuoteRs.xsd"/>
答案 1 :(得分:1)
可能是斜杠(\
vs /
),请尝试
D:/projects/DICACORD/DicAcordQuoteRs.xsd
如果不起作用,请尝试
file://D:/projects/DICACORD/DicAcordQuoteRs.xsd
答案 2 :(得分:0)
我能想到的一点是,根据规范,wsdl targetNamespace必须是绝对URI。请参阅wsdl primer的第2.2节。
请参阅有效URI格式的wikipedia。