使用Groovy在SoapUI中使用Xpath查询在XML节点中使用xsi获取属性值

使用Groovy在SoapUI中使用Xpath查询在XML节点中使用xsi获取属性值,groovy,soapui,Groovy,Soapui,请在下面找到我正在使用的XML,我需要在中提取mobileNumberVerified的状态以进行断言验证 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope" xmlns:xsd="http://www.w3.org/2001/XMLS

请在下面找到我正在使用的XML,我需要在中提取
mobileNumberVerified
的状态以进行断言验证

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <AccountVerifyResponse xmlns="myservice url">
         <mobileNumberVerified xsi:nil="true" region="+91" />
      </AccountVerifyResponse>
   </soapenv:Body>
</soapenv:Envelope>

我尝试了xpath查询
“//soapenv:Envelope[1]/soapenv:Body[1]/*:AccountVerifyResponse/*:mobileNumberVerified[1]/@*”
-我收到了预期的“+91”


对于xpath查询
“//soapenv:Envelope[1]/soapenv:Body[1]/*:AccountVerifyResponse/*:mobilenumberververified[1]/@xsi:nil”
-我得到了“路径解析器异常”错误

您可能因为没有设置名称空间而犯了错误,下面给出了xpath和XQuery获取属性值和标记值的示例

获取属性值的步骤

Groovy:

import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Add").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")
def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
log.info "Value of attribute is " + attr1
log.info "Value of attribute is " + attr2
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Sample").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")

def value = holder.getNodeValue('//ns1:mobileNumberVerified/text()')

log.info value
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def node = holder.getNodeValue("//ns1:mobileNumberVerified/text()")

//assert node==null
//assert node!=null
declare namespace ns1='myservice url';
declare namespace soapenv='http://schemas.xmlsoap.org/soap/envelope';

for $x in //ns1:AccountVerifyResponse
return
<status>{$x/ns1:mobileNumberVerified/text()}</status>
脚本断言:

import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Add").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")
def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
log.info "Value of attribute is " + attr1
log.info "Value of attribute is " + attr2
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Sample").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")

def value = holder.getNodeValue('//ns1:mobileNumberVerified/text()')

log.info value
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def node = holder.getNodeValue("//ns1:mobileNumberVerified/text()")

//assert node==null
//assert node!=null
declare namespace ns1='myservice url';
declare namespace soapenv='http://schemas.xmlsoap.org/soap/envelope';

for $x in //ns1:AccountVerifyResponse
return
<status>{$x/ns1:mobileNumberVerified/text()}</status>
获取节点值的步骤

Groovy:

import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Add").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")
def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
log.info "Value of attribute is " + attr1
log.info "Value of attribute is " + attr2
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Sample").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")

def value = holder.getNodeValue('//ns1:mobileNumberVerified/text()')

log.info value
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def node = holder.getNodeValue("//ns1:mobileNumberVerified/text()")

//assert node==null
//assert node!=null
declare namespace ns1='myservice url';
declare namespace soapenv='http://schemas.xmlsoap.org/soap/envelope';

for $x in //ns1:AccountVerifyResponse
return
<status>{$x/ns1:mobileNumberVerified/text()}</status>
脚本断言:

import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Add").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")
def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
log.info "Value of attribute is " + attr1
log.info "Value of attribute is " + attr2
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Sample").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")

def value = holder.getNodeValue('//ns1:mobileNumberVerified/text()')

log.info value
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def node = holder.getNodeValue("//ns1:mobileNumberVerified/text()")

//assert node==null
//assert node!=null
declare namespace ns1='myservice url';
declare namespace soapenv='http://schemas.xmlsoap.org/soap/envelope';

for $x in //ns1:AccountVerifyResponse
return
<status>{$x/ns1:mobileNumberVerified/text()}</status>
您可以使用groovy将值存储到属性中,也可以使用PropertyTransfer

declare namespace ns1='myservice url';
//ns1:AccountVerifyResponse/ns1:mobileNumberVerified/text()

XQuery匹配:

import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Add").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")
def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
log.info "Value of attribute is " + attr1
log.info "Value of attribute is " + attr2
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def attr1 = holder.getNodeValue("//ns1:mobileNumberVerified/@*:nil")
def attr2 = holder.getNodeValue("//ns1:mobileNumberVerified/@region")
import com.eviware.soapui.support.XmlHolder

def response = testRunner.testCase.getTestStepByName("Sample").getPropertyValue("response")
def holder = new XmlHolder(response)
holder.declareNamespace('ns1',"myservice url")

def value = holder.getNodeValue('//ns1:mobileNumberVerified/text()')

log.info value
import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"]="myservice url"

def node = holder.getNodeValue("//ns1:mobileNumberVerified/text()")

//assert node==null
//assert node!=null
declare namespace ns1='myservice url';
declare namespace soapenv='http://schemas.xmlsoap.org/soap/envelope';

for $x in //ns1:AccountVerifyResponse
return
<status>{$x/ns1:mobileNumberVerified/text()}</status>
声明名称空间ns1='myservice url';
声明名称空间soapenv=http://schemas.xmlsoap.org/soap/envelope';
对于//ns1中的$x:AccountVerifyResponse
返回
{$x/ns1:mobileNumberVerified/text()}

成功了,你是对的……我确实错过了名称空间。非常感谢所有的详细信息。我的声誉不到15,上面说我的投票已经被记录但没有显示。但我接受了答案:)