Groovy Xml Holder returns 'null' 作为现有属性的值
Groovy Xml Holder returns 'null' as a value of existing attribute
我正在尝试解析下面的 web-service 响应:
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
</soap-env:Header>
<soap-env:Body>
<GetReservationRS>
<Reservation>
<PassengerReservation>
<Passengers>
<Passenger id="4">
<AncillaryServices>
<AncillaryService id="15">
<RficSubcode>0AA</RficSubcode>
</AncillaryService>
</AncillaryServices>
</Passenger>
</Passengers>
</PassengerReservation>
</Reservation>
</GetReservationRS>
</soap-env:Body>
</soap-env:Envelope>
我需要获取位于 'AncillaryService' 标记中的 'id' 属性的值。为此,我编写了以下 XPath,它在 XML Notepad++ 的 Pathernizer 插件
中运行良好
//GetReservationRS/Reservation/PassengerReservation/Passengers/Passenger/AncillaryServices/AncillaryService[RficSubcode/text()='0AA']/@id
此外,我想为此操作创建一个 groovy 脚本。请在下面找到脚本摘录:
String responseText = context["Get reservation EMD#Response"]
responseText = responseText.replaceAll("<[A-Za-z0-9]+:", "<").replaceAll("</[A-Za-z0-9]+:", "</");
def xmlHolder = new XmlHolder(responseText)
String aeBookedRficSubCode = "0AA"
String prepaidAirExtrasXpath = "//GetReservationRS/Reservation/PassengerReservation/Passengers/Passenger/AncillaryServices/AncillaryService[RficSubcode/text()='${aeBookedRficSubCode}']/@id"
String prepaidAirExtras = xmlHolder.getNodeValue("${prepaidAirExtrasXpath}")
log.info prepaidAirExtras
脚本执行后,我可以在日志中看到 'null' 标题。因此,我的脚本从这个 XML 中提取 'null' 值。你有什么想法,我该如何解决这个问题?
提前致谢。
根据提供的 XML,我将使用的 XPath 是://*:AncillaryService/@id/text()
,它表示:
//
: 文档中任意位置
AncillaryService
:找到这个节点;如果有多个 ,将选择第一个
*:
: 任何命名空间
/@id
: select 其 "id" 属性
/text()
: select 该属性的文本值;如果您不指定 ,SoapUI 会假定这一点
至于您的 Groovy 脚本,我不太清楚您为什么要制作的如此复杂。应执行以下操作:
def prepaidAirExtras = context.expand( '${Get reservation EMD#Response#//*:AncillaryService/@id}' )
log.info prepaidAirExtras
我已经调查了上述问题中所述的问题,在我看来这是 XmlHolder 的问题,因为在 SOAP-envelope header 中有大约 50 个名称空间被去除并且 XmlHolder 无法解析原因不明。
因此,我决定以使用 XmlSlurper 而不是 XmlHolder 的方式重构测试脚本
String aeBookedRficSubCode = context["#TestSuite#aeRficSubcode"]
String responseText = context["Get reservation EMD#Response"]
def reservationResponseNode = new XmlSlurper().parseText(responseText).Body.GetReservationRS
def ancillaryServiceByTypeNode = reservationResponseNode.Reservation.PassengerReservation.Passengers.Passenger.AncillaryServices.'*'.find{node->
node.name() == "AncillaryService" && node.@RficSubcode == aeBookedRficSubCode
}
String prepaidId = ancillaryServiceByTypeNode.@id
testRunner.testCase.testSuite.setPropertyValue("aeBookedId", prepaidId)
log.info testRunner.getTestCase().testSuite.getPropertyValue("aeBookedId")
我正在尝试解析下面的 web-service 响应:
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
</soap-env:Header>
<soap-env:Body>
<GetReservationRS>
<Reservation>
<PassengerReservation>
<Passengers>
<Passenger id="4">
<AncillaryServices>
<AncillaryService id="15">
<RficSubcode>0AA</RficSubcode>
</AncillaryService>
</AncillaryServices>
</Passenger>
</Passengers>
</PassengerReservation>
</Reservation>
</GetReservationRS>
</soap-env:Body>
</soap-env:Envelope>
我需要获取位于 'AncillaryService' 标记中的 'id' 属性的值。为此,我编写了以下 XPath,它在 XML Notepad++ 的 Pathernizer 插件
中运行良好//GetReservationRS/Reservation/PassengerReservation/Passengers/Passenger/AncillaryServices/AncillaryService[RficSubcode/text()='0AA']/@id
此外,我想为此操作创建一个 groovy 脚本。请在下面找到脚本摘录:
String responseText = context["Get reservation EMD#Response"]
responseText = responseText.replaceAll("<[A-Za-z0-9]+:", "<").replaceAll("</[A-Za-z0-9]+:", "</");
def xmlHolder = new XmlHolder(responseText)
String aeBookedRficSubCode = "0AA"
String prepaidAirExtrasXpath = "//GetReservationRS/Reservation/PassengerReservation/Passengers/Passenger/AncillaryServices/AncillaryService[RficSubcode/text()='${aeBookedRficSubCode}']/@id"
String prepaidAirExtras = xmlHolder.getNodeValue("${prepaidAirExtrasXpath}")
log.info prepaidAirExtras
脚本执行后,我可以在日志中看到 'null' 标题。因此,我的脚本从这个 XML 中提取 'null' 值。你有什么想法,我该如何解决这个问题?
提前致谢。
根据提供的 XML,我将使用的 XPath 是://*:AncillaryService/@id/text()
,它表示:
//
: 文档中任意位置AncillaryService
:找到这个节点;如果有多个 ,将选择第一个
*:
: 任何命名空间/@id
: select 其 "id" 属性/text()
: select 该属性的文本值;如果您不指定 ,SoapUI 会假定这一点
至于您的 Groovy 脚本,我不太清楚您为什么要制作的如此复杂。应执行以下操作:
def prepaidAirExtras = context.expand( '${Get reservation EMD#Response#//*:AncillaryService/@id}' )
log.info prepaidAirExtras
我已经调查了上述问题中所述的问题,在我看来这是 XmlHolder 的问题,因为在 SOAP-envelope header 中有大约 50 个名称空间被去除并且 XmlHolder 无法解析原因不明。
因此,我决定以使用 XmlSlurper 而不是 XmlHolder 的方式重构测试脚本
String aeBookedRficSubCode = context["#TestSuite#aeRficSubcode"]
String responseText = context["Get reservation EMD#Response"]
def reservationResponseNode = new XmlSlurper().parseText(responseText).Body.GetReservationRS
def ancillaryServiceByTypeNode = reservationResponseNode.Reservation.PassengerReservation.Passengers.Passenger.AncillaryServices.'*'.find{node->
node.name() == "AncillaryService" && node.@RficSubcode == aeBookedRficSubCode
}
String prepaidId = ancillaryServiceByTypeNode.@id
testRunner.testCase.testSuite.setPropertyValue("aeBookedId", prepaidId)
log.info testRunner.getTestCase().testSuite.getPropertyValue("aeBookedId")