簡體   English   中英

XPath評估空目標節點中的結果

[英]XPath evaluation of results in an empty target node

我的wsdl規范包含導入的XSD架構。

wsdl文件如下所示

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ....>
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd2" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svcc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/System.Web.Services.Protocols"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd0" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd1" namespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.Services"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd5" namespace="http://schemas.datacontract.org/2004/07/System"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd6" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd7" namespace="http://schemas.datacontract.org/2004/07/System.Collections.Generic"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd8" namespace="http://schemas.datacontract.org/2004/07/ABC.Fs.UIEntities"/>
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd9"/>
</xsd:schema>
</wsdl:types>
 .......
 </wsdl:definitions>

我的jaxb綁定文件如下所示:

<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
    wsdlLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?wsdl">
    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']">
    <jaxb:class name="NodeTypeString"/>
    </jaxws:bindings>    
</jaxws:bindings>

如果我不使用bindings.xml,我通過wsimport生成java類時會出現以下錯誤

[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 1 of https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3

[ERROR] (Related to above error) This is the other declaration.
  line 1 of https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3

Schema抱怨下面的樣子

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels">
<xs:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd6" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
.......
<xs:complexType name="Node">
<xs:sequence>
<xs:element minOccurs="0" name="Description" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="Type" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="Users" nillable="true" type="tns:ArrayOfUser"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Node" nillable="true" type="tns:Node"/>
......

但是現在當我使用bindings.xml時,我收到以下錯誤

[ERROR] XPath evaluation of "wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']" results in an empty target node
  line 8 of file:/E:/projects/codegeneration/bindings.xml

我錯過了什么? 我正在使用wsimport來生成類。

<xsd:import>實際上不會更改WSDL文件的XML文檔樹。 您有與wsdl:definitions/wsdl:types/xs:schema/xs:import匹配的元素wsdl:definitions/wsdl:types/xs:schema/xs:import ,而不是wsdl:definitions/wsdl:types/xs:schema/xs:complexType/xs:sequence/xs:element

JAX-WS規范的“自定義”章節說:

此外, jaxb:bindings可能作為jaxws:bindings元素的子元素出現在JAX-WS外部綁定文件中,該元素的node屬性指向WSDL文檔中的xs:schema元素。 處理模式時,結果必須好像jaxb:bindings元素在模式文檔中作為模式組件的注釋內聯。

在為WSDL文檔中嵌入的模式文檔處理JAXB綁定聲明(即jaxb:bindings元素)時,所有出現在其中的XPath表達式必須被解釋為包含xs:schema元素是獨立模式文檔的根。

所以,你的內部jaxws:bindings元素必須包含xs:schema元素的XPath,而不是它的任何后代:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
    <jaxb:bindings node="xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']">
        <jaxb:class name="NodeTypeString"/>
    </jaxb:bindings>
</jaxws:bindings>    

我不確定上面的內容是否真的適用於使用<xsd:import> 您可能必須明確引用導入的模式:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
    <jaxb:bindings schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd2">
        <jaxb:bindings node="xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']">
            <jaxb:class name="NodeTypeString"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxws:bindings>    

對於我面臨的這個問題,我有兩個解決方案。

  1. 我通過在其中添加導入的模式並刪除import語句來簡化wsdl模式。
  2. 首先使用xjc為導入的模式構建一集

    xjc -episode myschema.episode myschema.xsd

    然后通過wsimport將該劇集用作生成java類的綁定

    wsimport mywsdl.wsdl -b myschema.episode

更多關於第二個解決方案在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM