我有一个用.NET实现的服务的WSDL文件。我也有一个相同的文件,其中包含由第三方制作的一些“自定义”,以使文件可以容忍wsimport
,主要是以下形式:
<s:annotation>
<s:appinfo>
<jaxb:property name="result"/>
</s:appinfo>
</s:annotation>
我希望能够处理来自供应商的原始 WSDL以及这些覆盖,但我想在外部指定它们。我看到我可以使用-b
wsimport
选项来“绑定文件”,我试图写一个目前看起来像这样的覆盖文件:
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings node="//xs:element[@name='MyElementResult']">
<jxb:property name="result"/>
</jxb:bindings>
</jxb:bindings>
我已经确认“MyElementName”确实存在于此处的元素中:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="vendor-uri"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:s2="http://microsoft.com/wsdl/types/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="vendor-namespace"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
[...]
<s:element name="MyElementResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="MyElementResult" type="tns:Result" />
我从wsimport
收到此警告(因此没有更改):
[ERROR] XPath evaluation of "//xs:element[@name='MyElementResult']" results in empty target node
line 4 of file:/Users/..../wsdl/custom-bindings.xjb
我的声明中遗漏了什么?我的XPath表达式不正确吗?如果我的XPath /覆盖工作正常,是否正确格式化以获得与编辑原始WSDL相同的结果?
这是否可以使用外部文件,或者我是否必须使用这些相同的更改重新修改WSDL的任何未来版本?
答案 0 :(得分:0)
您需要在绑定XML文件中提供架构位置。
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings
schemaLocation="PATH_TO_YOUR_WSDL#types?schema1"
node="//xs:schema[@targetNamespace='SCHEMA_NAMESPACE']">
<jxb:bindings node="//xs:element[@name='MyElementResult']">
<jxb:property name="result"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
WSDL文件名之后的#types?schema1
将指定您绑定的WSDL中的哪个模式,从1开始。