如何从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响应:

我第一次使用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响应:

:{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。我一直在看这个答案,但它没有帮助我解决这个问题,因为标记和级别略有不同