2017-04-10 4 views
0

は、私がスクリプト(グルーヴィー)アサーションを探求しようとしていたxml responceです:このXPath(ターゲットへのすべてのノード)が(SoapUIを使用して)応答して要素を表示できないのはなぜですか?ここ

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <myInfoResponse xmlns="http://test.test.test.test"> 
     <pc>1234223234</pc> 
     <item> 
      <sl>val1</sl> 
      <he>val2</he> 
      <ko>val3</ko> 
      <fo>val4</fo> 
      <ok>val5</ok> 
      <di>val6</di> 
     </item> 
... 

私はpcノードの値を取得することはできません理由:

def holder = new XmlHolder(messageExchange.responseContentAsXml) 
holder.getNodeValue("/S:Envelope/S:Body/myInfoResponse/pc") 
// Output: null 
holder.getNodeValue("/S:Envelope/S:Body/myInfoResponse[1]/pc[1]") 
// Output: null 

そして、私はして値を取得することができますXPath

holder.getNodeValue("/S:Envelope/S:Body/*[1]/*[1]") 
// Output: 1234223234 
holder.getNodeValue("/S:Envelope/S:Body/*[1]/*[2]/*[4]") 
// Output: val4 

なぜですか?

+3

http://www.edankert.com/defaultnamespaces.html – Rao

+2

ため、デフォルトの名前空間の:以下

XmlSlurperを使用してgetNodeValue

//Check if the response is not empty assert context.response, 'Response is empty or null' def holder = new com.eviware.soapui.support.XmlHolder(context.response) //You may also change the prefix other than mentioned in the response like below holder.declareNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/') //Below namespace uri does not have prefix in the response, but now setting prefix as ns holder.declareNamespace('ns', 'http://test.test.test.test') def pcValue = holder.getNodeValue('//soap:Envelope/soap:Body/ns:myInfoResponse/ns:pc') log.info "Response of has pc value : ${pcValue}" 

を使用してスクリプトアサーションです。あなたが所有者と名前空間に関係なく取り出したい場合は、 'holder.getNodeValue("/S:Envelope/S:Body/*:myInfoResponse/*:pc ")' –

答えて

1

それはコメントで述べたように、要素myInfoResponseは、デフォルトの名前空間を持っています。そのため、pcの値を取得できませんでした。

assert context.response 
def parsedXml = new XmlSlurper().parseText(context.response) 
def pcValue = parsedXml.'**'.find {it.name() == 'pc'}.text() 
log.info "Response of has pc value : ${pcValue}" 
//Similarly you can find any element name, for example item/fo 
def foVal = parsedXml.'**'.find {it.name() == 'fo'}.text() 
log.info "fo value is : ${foVal}" 
+0

ありがとう!デフォルトネームスペースについて考えていない –

+0

あなたはまだ質問に答えられていないので、より多くの情報を探していますか? – Rao

0

まだholder.getNodeValue()を取得する方法がわかりませんが、XmlSlurperで正常に動作しています。

Groovy docs "Processing XML"

def Envelope = new XmlSlurper().parseText(messageExchange.responseContentAsXml) 
log.info("pc = " + Envelope.Body.myInfoResponse.pc.text()) 
// Output: 1234223234 
関連する問題