无法通过groovy中的getNodeValue函数获取xpath中的节点值

时间:2016-05-06 07:21:06

标签: xpath groovy soapui

我无法获得" idNumber"的节点值。在下面的响应中xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <SOAP_Customer_Metadata_CALLResponse xmlns="http://BCE/Customer_Metadata_WS.tws">
         <oMetaDataID>
            <ocrStatus>Failed</ocrStatus>
            <guid>123456</guid>
            <docType>03</docType>
            <docDescription>South African ID</docDescription>
            <surname>Choudhary</surname>
            <fullName>Kanika</fullName>
            <idNumber>KANJANDHS293</idNumber>
            <dateOfBirth>22091945</dateOfBirth>
            <dateIssued>01012016</dateIssued>
            <countryOfBirth>India</countryOfBirth>
            <idType>ID</idType>
            <gender>F</gender>
         </oMetaDataID>
         <oMetaDataPOA>
            <ocrStatus>Passed</ocrStatus>
            <surname>Choudhary</surname>
            <idNo>12345</idNo>
            <address1>abc def</address1>
         </oMetaDataPOA>
         <oResubmission>No</oResubmission>
         <oCASASequenceNo>1234578</oCASASequenceNo>
         <oTypeOfCustomer>New</oTypeOfCustomer>
      </SOAP_Customer_Metadata_CALLResponse>
   </soapenv:Body>
</soapenv:Envelope>

Groovy脚本中使用以下代码 testStep:

holder.getNodeValue("//idNumber")

2 个答案:

答案 0 :(得分:1)

这可能是因为XML具有默认命名空间

xmlns="http://BCE/Customer_Metadata_WS.tws"

SOAP_Customer_Metadata_CALLResponse中没有前缀的所有元素,包括idNumber,都被认为是在该命名空间中。要在默认命名空间中选择元素,您需要将前缀映射到默认命名空间URI,并在XPath中使用该前缀。例如,如果注册的前缀是d//d:idNumber(我不知道groovy但this post可能有用)。

等效的纯XPath方式将使用XPath函数local-name()namespace-uri()的组合:

//*[local-name()='idNumber' and namespace-uri()='http://BCE/Customer_Metadata_WS.tws']

答案 1 :(得分:0)

当@ har07回答时,您可以定义命名空间前缀,然后在 XPath 中使用它。但是 SOAPUI XmlHolder支持名称空间的通配符*,因此您只需在 XPath 上使用它:

holder.getNodeValue("//*:idNumber")

修改

在评论中使用holder.getNodeValue("//*:oMetaDataID/ocrStatus")的问题是你错过了第二个元素的命名空间,在这里你也可以再次使用*通配符:

holder.getNodeValue("//*:oMetaDataID/*:ocrStatus")