我正在尝试针对WSDL验证SOAP响应消息,并且我遵循给定in this question的示例。但是,我在下面得到了例外。
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'SOAP-ENC:Array' to a(n) 'type definition' component.
我已经看到a question类似的错误,但我不确定这是否是同一个问题。我也不明白为什么SOAP-ENC:Array
在SOAP spec出现时会被视为非标准。
这是我的验证码。 Schema schema = schemaFactory.newSchema(schemas)
行引发了例外情况。
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document wsdlDoc = db.newDocument();
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source wsdlSource = new StreamSource(new File("d:\\temp\\demo.wsdl"));
transformer.transform(wsdlSource, new DOMResult(wsdlDoc));
NodeList schemaNodes = wsdlDoc.getElementsByTagNameNS(XMLConstants.W3C_XML_SCHEMA_NS_URI, "schema");
int nrSchemas = schemaNodes.getLength();
Source[] schemas = new Source[nrSchemas];
for (int i = 0; i < nrSchemas; ++i)
{
schemas[i] = new DOMSource(schemaNodes.item(i));
}
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemas);
Validator validator = schema.newValidator();
Source soapMessage = new StreamSource(new File("d:\\temp\\soapmessage.xml"));
Result result = new StreamResult(System.out);
validator.validate(soapMessage, result);
我已经修改了WSDL并且只留下了相关部分,或者至少我认为是相关的部分。如果需要更多,我会更新问题。
<?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="run:demo"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="run:demo">
<types>
<xsd:schema targetNamespace="run:demo">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
<xsd:complexType name="itemsCT">
<xsd:all>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Address" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="itemsArray">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType"
wsdl:arrayType="tns:itemsCT[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
</types>
</definitions>
答案 0 :(得分:1)
当前问题是被调用的模式验证器没有为命名空间http://schemas.xmlsoap.org/soap/encoding/加载任何模式文档 - 要么是因为它是一个通用的验证器,并且没有任何内置的SOAP命名空间知识,要么是因为它无法在schemas.xmlsoap.org上从服务器检索模式文档。
如果您拥有http://schemas.xmlsoap.org/soap/encoding/和http://schemas.xmlsoap.org/wsdl/命名空间的架构的本地副本,则可以尝试将架构位置信息添加到架构中的两个xsd:import元素。如果你没有本地副本,那么我希望你能比我现在更好地从schemas.xmlsoap.org获得回复。