我试图解析下面的网络服务响应:
<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>
我需要获得&#39; id&#39;位于&#39;辅助服务中的属性&#39;标签。为此,我编写了以下XPath,它可以在Notepad ++的XML 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
脚本执行后,我可以看到一个&#39; null&#39;日志中的标题。所以,我的脚本提取了&#39; null&#39;来自此XML的值。你有任何想法,我怎么能解决这个问题?
提前谢谢。
答案 0 :(得分:1)
从提供的XML中,我将使用的XPath是://*:AncillaryService/@id/text()
,其中包含:
//
:文档中的任何位置AncillaryService
:找到此节点;如果有多个*:
:使用任何命名空间/@id
:选择其“id”属性/text()
:选择该属性的文本值;如果您未指定至于你的Groovy脚本,我不太确定你为什么这么复杂。以下应该做:
def prepaidAirExtras = context.expand( '${Get reservation EMD#Response#//*:AncillaryService/@id}' )
log.info prepaidAirExtras
答案 1 :(得分:0)
我已经调查了上述问题中陈述的问题,在我看来它是XmlHolder的问题,因为在SOAP-envelope标头中有大约50个名称空间被删除,而XmlHolder可以&# 39; t解析它的原因不明。
所以,我决定以使用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")