2017-04-10 34 views
0

下面是一個XML性反應,我試圖用腳本(常規)斷言探索:爲什麼這個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

因爲默認的命名空間。如果你想獲取與持有者無關的名稱空間,那麼'holder.getNodeValue(「/ S:Envelope/S:Body/*:myInfoResponse/*:pc」)' –

回答

1

就像是在評論中提到的,元素myInfoResponse具有默認命名空間。這就是爲什麼你無法獲得pc的價值。

下面是腳本使用斷言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}" 

使用的XmlSlurper

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 
相關問題