在选择多个节点时获得错误“导致空目标节点”

时间:2014-09-15 14:26:31

标签: xpath jaxb2

我有一个类似下面的WSDL

<wsdl:definitions targetNamespace="http://pk/training/basit/webservice/message/lmsapi/serviceoperations">
<wsdl:types>
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://pk/training/basit/webservice/message/lmsapi/serviceoperations">
        <xsd:import namespace="http://trainingplan.types.lmsapi.message.webservice.basit.training.pk"/>
        ...
        <xsd:element name="CreateTrainingPlanRequest">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="TrainingPlans" type="ns0:TrainingPlans"/>
                </xsd:sequence>
                <xsd:attribute name="customerCode" type="xsd:string" use="required"/>
                <xsd:attribute name="key" type="xsd:string" use="required"/>
            </xsd:complexType>
        </xsd:element>
        <xsd:element name="CreateTrainingPlanResponse">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element minOccurs="0" name="ResponseTrainingPlans" type="ns0:ResponseTrainingPlans"/>
                </xsd:sequence>
                <xsd:attribute name="transactionResult" type="TransactionResultType" use="required"/>
                <xsd:attribute name="transactionResultMessage" type="xsd:string"/>
            </xsd:complexType>
        </xsd:element>
        <xsd:element name="AssignTrainingPlanToLearnerRequest">
            ...
        </xsd:element>
        ....
</wsdl:definitions>

现在我想使用XPath选择具有名称属性的所有三个元素。当我做了以下我得到了值

<jaxb:bindings schemaLocation="http://localhost:8080/lms/service/lms-api/lmsApi.wsdl" node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations']/xsd:element[@name='CreateTrainingPlanRequest']">

但是当我尝试选择多个节点时,比如

<jaxb:bindings schemaLocation="http://localhost:8080/lms/service/lms-api/lmsApi.wsdl" node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations']/xsd:element[@name='CreateTrainingPlanRequest' and @name='CreateTrainingPlanResponse' and @name='AssignTrainingPlanToLearnerRequest']">

然后我收到以下错误

com.sun.istack.SAXParseException2: XPath evaluation of "/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http:/pk/training/basit/webservice/message/lmsapi/serviceoperations']/xsd:element[@name='CreateTrainingPlanRequest' and @name='CreateTrainingPlanResponse' and @name='AssignTrainingPlanToLearnerRequest']" results in empty target node

为什么我得到空节点。我的XPath表达式出了什么问题?

由于

编辑: --------------------------------

<jaxb:bindings schemaLocation="http://localhost:8080/lms/service/lms-api/lmsApi.wsdl" node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations']/xsd:element[@name='CreateTrainingPlanRequest' or @name='CreateTrainingPlanResponse' or @name='AssignTrainingPlanToLearnerRequest']">
    <jaxb:schemaBindings>
        <jaxb:package name="pk.training.basit.webservice.messages.lmsapi.serviceoperations.trainingplan" />
    </jaxb:schemaBindings>
</jaxb:bindings>

<jaxb:bindings schemaLocation="http://localhost:8080/lms/service/lms-api/lmsApi.wsdl" node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations'](/xsd:element[@name='AddCustomerRequest']) and (/xsd:element[@name='AddCustomerResponse'])">
    <jaxb:schemaBindings>
        <jaxb:package name="pk.training.basit.webservice.messages.lmsapi.serviceoperations.customer" />
    </jaxb:schemaBindings>
</jaxb:bindings>

1 个答案:

答案 0 :(得分:1)

当你说

<jaxb:bindings schemaLocation="http://localhost:8080/lms/service/lms-api/lmsApi.wsdl"
 node="/wsdl:definitions/wsdl:types/xsd:schema[
  @targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations'
]/xsd:element[@name='CreateTrainingPlanRequest' and @name='CreateTrainingPlanResponse'
   and @name='AssignTrainingPlanToLearnerRequest']">

您要求同一元素上xsd:element属性具有三个不同值的任何@name。这是不可能的。也许你想要

<jaxb:bindings schemaLocation="http://localhost:8080/lms/service/lms-api/lmsApi.wsdl"
 node="/wsdl:definitions/wsdl:types/xsd:schema[
  @targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations'
]/xsd:element[@name='CreateTrainingPlanRequest' or @name='CreateTrainingPlanResponse'
   or @name='AssignTrainingPlanToLearnerRequest']">

即。将and更改为or

更新

如果您尝试选择一个xsd:schema元素,其中包含xsd:element个具有三个名字的子元素,则以下是您需要的XPath表达式:

node="/wsdl:definitions/wsdl:types/xsd:schema[
  @targetNamespace='http://pk/training/basit/webservice/message/lmsapi/serviceoperations'
 and xsd:element[@name='CreateTrainingPlanRequest'] and 
  xsd:element[@name='CreateTrainingPlanResponse'] and
  xsd:element[@name='AssignTrainingPlanToLearnerRequest']"