Groovy Xml Holder 返回'null'作为现有属性的值



我正在尝试解析下面的网络服务响应:

<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>

我需要获取位于"辅助服务"标签中的"id"属性值。为此,我编写了以下XPath,它在记事本++的XML路径器插件中工作正常

//GetReservationRS/Reservation/PassengerReservation/Passengers/Passenger/AncillaryServices/AncillaryService[RficSubcode/text()='0AA']/@id

另外,我想为此操作创建一个时髦的脚本。请在下面找到脚本摘录:

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:选择其"id"属性
  • /text() :选择该属性的文本值;SoapUI 假定这一点,如果你不指定

至于你的Groovy脚本,我不太确定你为什么要制作如此令人难以置信的复杂。以下操作应:

def prepaidAirExtras = context.expand( '${Get reservation EMD#Response#//*:AncillaryService/@id}' )
log.info prepaidAirExtras

我已经调查了上面问题中提到的问题,在我看来这是 XmlHolder 的问题,因为在 SOAP 信封标头中大约有 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") 

最新更新