如何从xml中检索属性
我第一次使用XMLParser从xml检索响应: 代码如下:如何从xml中检索属性,xml,groovy,soapui,Xml,Groovy,Soapui,我第一次使用XMLParser从xml检索响应: 代码如下: import groovy.xml.XmlUtil def response = testRunner.testCase.getTestStepByName("GetTestStep").getProperty("Response").getValue(); def root = new XmlParser().parseText( response ) log.info root root的log.info显示以下xml响应:
import groovy.xml.XmlUtil
def response = testRunner.testCase.getTestStepByName("GetTestStep").getProperty("Response").getValue();
def root = new XmlParser().parseText( response )
log.info root
root的log.info显示以下xml响应:
:{http://schemas.xmlsoap.org/soap/envelope/}Envelope[attributes={}; value=[{http://schemas.xmlsoap.org/soap/envelope/}Body[attributes={}; value=[{http://www.xxx}TestHotelResponse[attributes={}; value=[{http://www.xxx}AvailabilityRS[attributes={Url=http://xxx.xxxxxxxx.com }; value=[{http://www.xxx.es/xxxxxx/2007/}
现在,我希望能够检索AvailabilityRS
的属性,但是,当我尝试通过此方法检索它时,我总是得到一个空白[]:
root.AvailabilityRS*.value()*.each { k, v ->
log.info ("$k.localPart = $v")
}
原始XML:
<soap:Envelope xmlns:soap="http://schemas.xxx">
<soap:Body>
<xxx xmlns="http://www.xxx7/">
<xxx Url="http://xxx.xxxxxx.com">
如何在AvailabilityRS属性中检索Url
谢谢,以下作品:
def str='''\
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HotelAvailResponse xmlns="http://www.xxx/">
<AvailabilityRS Url="http://xxx.xxxxxx.com" TimeStamp="2017-02-03T11:14:30.5744079+00:00" IntCode="xxx" />
</HotelAvailResponse>
</soap:Body>
</soap:Envelope>
'''
def xml = new XmlParser().parseText(str)
def url = xml.'soap:Body'.HotelAvailResponse[0].AvailabilityRS[0].@Url
println url
def str=''\
'''
def xml=new XmlParser().parseText(str)
def url=xml.soap:Body.HotelAvailResponse[0]。AvailabilityRS[0]。@url
println url
请注意属性值的at@
字符前缀。如果属性是连字符的或不是有效的groovy标识符,则可以使用带引号的节点。'@attribute name'
请注意,表达式xml.soap:Body.HotelAvailResponse
返回一个节点列表,这就是为什么我在这两个表达式中都添加了[0]
。感觉上可能有任意数量的HotelAvailResponse节点,因此groovy即使只有一个节点也会返回一个列表。在不使用[0]
索引的情况下运行上述操作将返回一个以url为元素的列表
还要注意,通过@
字符访问属性的结果是字符串,而不是xml节点 以下工作:
def str='''\
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HotelAvailResponse xmlns="http://www.xxx/">
<AvailabilityRS Url="http://xxx.xxxxxx.com" TimeStamp="2017-02-03T11:14:30.5744079+00:00" IntCode="xxx" />
</HotelAvailResponse>
</soap:Body>
</soap:Envelope>
'''
def xml = new XmlParser().parseText(str)
def url = xml.'soap:Body'.HotelAvailResponse[0].AvailabilityRS[0].@Url
println url
def str=''\
'''
def xml=new XmlParser().parseText(str)
def url=xml.soap:Body.HotelAvailResponse[0]。AvailabilityRS[0]。@url
println url
请注意属性值的at@
字符前缀。如果属性是连字符的或不是有效的groovy标识符,则可以使用带引号的节点。'@attribute name'
请注意,表达式xml.soap:Body.HotelAvailResponse
返回一个节点列表,这就是为什么我在这两个表达式中都添加了[0]
。感觉上可能有任意数量的HotelAvailResponse节点,因此groovy即使只有一个节点也会返回一个列表。在不使用[0]
索引的情况下运行上述操作将返回一个以url为元素的列表
还要注意,通过
@
字符访问属性的结果是字符串,而不是xml节点 将脚本更改为下面,以检索Url
:请注意,
@
需要用于检索属性
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue()
def parsedXml = new XmlSlurper().parseText(xml)
def url = parsedXml.'**'.find{ it.name() == 'AvailabilityRS' }.@Url.text()
log.info "Url is :${url}"
将脚本更改为下面,以检索
Url
:请注意,
@
需要用于检索属性
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue()
def parsedXml = new XmlSlurper().parseText(xml)
def url = parsedXml.'**'.find{ it.name() == 'AvailabilityRS' }.@Url.text()
log.info "Url is :${url}"
一些实验基于目前为止提供的两个答案 这些都提供了相同的结果:
[http://stagejuniperws.xxxxxx.com]
//如果您知道确切的路径
println root.'soap:Body'。HotelAvailResponse[0]。AvailabilityRS*@Url
//详细代码
println root.depthFirst().inject([]){URL,节点->
if(node.name().localPart==“AvailabilityRS”){
URL根据目前提供的两个答案进行了一些实验
这些都提供了相同的结果:[http://stagejuniperws.xxxxxx.com]
//如果您知道确切的路径
println root.'soap:Body'。HotelAvailResponse[0]。AvailabilityRS*@Url
//详细代码
println root.depthFirst().inject([]){URL,节点->
if(node.name().localPart==“AvailabilityRS”){
URL请参见。否则,您可以显示原始xml响应吗?我已经包含了原始xml。我尝试了您指示我的答案,但它仍然显示为空,可能是@GregorPetrin的重复项。我一直在查看此答案,但由于标记和级别的细微差异,它对我解决此问题没有帮助。否则,您可以显示为空吗请回答原始xml?我已经包含了原始xml。我尝试了您指示我的答案,但它仍然显示可能重复的@GregorPetrin。我一直在看这个答案,但它没有帮助我解决这个问题,因为标记和级别略有不同