2015-10-14 113 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) 

希望这有助于