2015-10-14 60 views
0

所以我有一個步驟,需要一些數字ID &在數據庫中查找它們的值。我希望能夠編輯響應xml &包括從數據庫中獲取的值爲了可讀性的目的。SOAPUI Groovy腳本插入自定義值的xml節點

我想出瞭如何將xml節點添加到xmlHolder中,但是我似乎無法在節點內放置一個值。

這是最接近「看似」工作代碼:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 

def dbResult = testRunner.testCase.testSteps["getOfferNames"].getResponseContent() 
def xmlOfferNames = groovyUtils.getXmlHolder(dbResult) 

def names = xmlOfferNames.getNodeValues("//NAME") 
def codes = xmlOfferNames.getNodeValues("//OFFERCODE1") 

def recs = groovyUtils.getXmlHolder("getRetailRecommendation#Response") 

def insert 
for(int i=0; i<names.size(); i++){ 
    for(node in recs.getDomNodes("//RetailRecommendation[OfferCode='"+codes[i]+"']")){ 
     //insert = '<OFFER_NAME>'+names[i]+'</OFFER_NAME>' //nothing is taking strings 
     //node.appendNode(new Node(node, 'OFFER_NAME', names[i])) //dne constructor 
     insert = node.getOwnerDocument().createElementNS(node.getNamespaceURI(), "OFFER_NAME") 
     //log.info names[i] 
     insert.setNodeValue(names[i]) 
     //log.info insert.metaClass.methods*.name.sort().unique() 
     node.insertBefore(insert , node.getFirstChild()) 
    } 
} 

recs.updateProperty() 
log.info recs.getXml() 

然而,當它打印出生成的XML我只是空<OFFER_NAME/>標籤,沒有任何價值。

我試過使用insert.setTextContent(),但它說java.long.RuntimeException: DOM Level 3 Not implemented。我沒有看到任何可以用來設置值的東西。

(半相關地,這奇怪不要麼更新我的步驟XML,但我還沒有開始研究這還)

回答

0

原來你不能只添加一個字符串到元素,你必須創建一個文本節點。

insert.appendChild(node.getOwnerDocument().createTextNode(names[i])) 
+0

代碼只能與沒有解釋的答案被認爲是低質量的,請加一個解釋上面的線是如何被使用,以及如何解決問題。 – Dijkgraaf

1

而不是使用holder來修改你的XML使用XmlSlurper嘗試:

import groovy.xml.XmlUtil 
def xml = '''<sample> 
    <RetailRecommendation> 
     <OfferCode>a1</OfferCode> 
    </RetailRecommendation> 
    <RetailRecommendation> 
     <OfferCode>b2</OfferCode> 
    </RetailRecommendation> 
    <RetailRecommendation> 
     <OfferCode>a1</OfferCode> 
     <OfferCode>ac3</OfferCode> 
    </RetailRecommendation> 
</sample> 
''' 

def recs = new XmlSlurper().parseText(xml) 

def names = ['kilo','mega','giga'] 
def codes = ['a1','b2','ac3'] 

// for each name 
names.eachWithIndex{ name, i -> 

    // find all OfferCode elements inside RetailRecommendation 
    // where value is in codes[i] array 
    recs.RetailRecommendation.'**'.findAll { node -> 
     node.name() == 'OfferCode' && node.text() == codes[i] 
    }.each{ elem -> // for each element... 
     // create the new node to add 
     def nodeToAdd = new XmlSlurper().parseText('<OFFER_NAME>' + name + '</OFFER_NAME>') 
     // and append the node to your element 
     elem.parent().appendNode(nodeToAdd) 
    } 
} 

log.info XmlUtil.serialize(recs) 

這導致:

<sample> 
    <RetailRecommendation> 
     <OfferCode>a1</OfferCode> 
     <OFFER_NAME>kilo</OFFER_NAME> 
    </RetailRecommendation> 
    <RetailRecommendation> 
     <OfferCode>b2</OfferCode> 
     <OFFER_NAME>mega</OFFER_NAME> 
    </RetailRecommendation> 
    <RetailRecommendation> 
     <OfferCode>a1</OfferCode> 
     <OfferCode>ac3</OfferCode> 
     <OFFER_NAME>kilo</OFFER_NAME> 
     <OFFER_NAME>giga</OFFER_NAME> 
    </RetailRecommendation> 
</sample> 

裏面你的代碼,你可以繼續使用holder獲得namescodes,但改變你修改響應的方式,一起可能是這樣的:

import groovy.xml.XmlUtil 

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 

def dbResult = testRunner.testCase.testSteps["getOfferNames"].getResponseContent() 
def xmlOfferNames = groovyUtils.getXmlHolder(dbResult) 

def names = xmlOfferNames.getNodeValues("//NAME") 
def codes = xmlOfferNames.getNodeValues("//OFFERCODE1") 

def recs = new XmlSlurper().parseText(context.expand('${getRetailRecommendation#Response}')) 

// for each name 
names.eachWithIndex{ name, i -> 

    // find all OfferCode elements inside RetailRecommendation 
    // where value is in codes[i] array 
    recs.RetailRecommendation.'**'.findAll { node -> 
     node.name() == 'OfferCode' && node.text() == codes[i] 
    }.each{ elem -> 
     // for each node found it 
     def nodeToAdd = new XmlSlurper().parseText('<OFFER_NAME>' + name + '</OFFER_NAME>') 
     elem.parent().appendNode(nodeToAdd) 
    } 
} 

log.info XmlUtil.serialize(recs) 

希望這有助於