2015-04-02 2 views
1

Я пытаюсь изменить SOAP-запрос, добавив дублирующий дочерний узел с различным значением.SOAPUI: Изменить запрос: Groovy: appendNode применимые аргументы

Это то, что я до сих пор:

Запрос:

<soapenv:Envelope xlmns:ns1 = "..." xlmns:ns2 = "..." xlmns:ns3 = "..." xlmns:ns4 = "..."> 
    <soapenv:Body> 
     <ns2:OperationName> 
      <ns3:CuteN>77777</ns3:CuteN> 
      <ns3:RaveN>666</ns3:RaveN> 
     </ns2:OperationName> 
    </soapenv:Body> 
</soapenv:Envelope> 

Запрос должен быть изменен следующим образом: (заполнить теги XML & добавить другой тег <RaveN></RaveN> со значением)

<soapenv:Envelope xlmns:ns1 = "..." xlmns:ns2 = "..." xlmns:ns3 = "..." xlmns:ns4 = "..."> 
    <soapenv:Body> 
     <ns2:OperationName> 
      <ns3:CuteN>77777</ns3:CuteN> 
      <ns3:RaveN>666</ns3:RaveN> 
      <ns3:RaveN>888</ns3:RaveN> 
     </ns2:OperationName> 
    </soapenv:Body> 
</soapenv:Envelope> 

Используемый код:

/* Groovy Utilities Declaration */ 
def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context) 

/* Request Holder Setup */ 
def request  = context.expand('${RequestStepName#Request}') 
def requestHolder = groovyUtils.getXmlHolder("request") 

/* Declaring Namespaces */ 
requestHolder.namespaces["soapenv"] = "http://schemas.xmlsoap.org/soap/envelope/" 
requestHolder.namespaces["ns2"]  = "..." 
requestHolder.namespaces["ns3"]  = "..." 
requestHolder.namespaces["ns4"]  = "..." 

/* Set few string names */ 
def soapEnvXString  = "//soapenv:Envelope" 
def soapBodyXString  = "/soapenv:Body" 
def operXString   = "/ns2:OperationName" 
def raveNumXString  = "/ns3:RaveNum" 

/* create object of Request nodes */ 
def parentNode  = requestHolder.getDomNode(soapEnvXString + soapBodyXString + operXString) 

def reqRaveNumTwo = "888" 

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def secondRaveNumNode = new XmlSlurper(false,false).parseText("""<ns3:RaveNum>${reqRaveNumTwo}</ns3:RaveNum>""") 
    parentNode.appendNode(secondRaveNumNode) 
} 

/* Update the request holder properties */ 
requestHolder.updateProperty(true) 

Ошибка:

groovy.lang.MissingMethodException: No signature of method: org.apache.xmlbeans.impl.store.Xobj$ElementXobj.appendNode() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: [888] 

Я знаю, что я что-то не хватает здесь, это мой третий день Groovy глубокого погружения. Любая помощь будет высоко оценена, спасибо заранее!

+0

На этот вопрос ответил @Albciff ниже. Было внесено несколько изменений, которые я сделал для вышеупомянутого кода, чтобы заставить его фактически работать. Обновленный код приведен ниже. – ssc

ответ

0

Я думаю, что есть две проблемы в вашем коде, вы впервые использовать appendChild метод, потому что вы пытаетесь добавить ребенка внутри <ns2:OperationName> узла (не appendNode метод, который не существует в вашем объекте), то вторая проблема заключается в том, что вы смешиваете классы XmlSlurper с XmlBeans, потому что вы не можете добавить «узлы» к объекту от одного движка к другому.

Вы имеете, чтобы изменить код внутри вашего if заявление, чтобы соответствовать эти поправки, так что вы можете использовать что-то вроде:

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def nodeHolder = groovyUtils.getXmlHolder("<ns3:RaveNum xmlns:ns3=\"...\">${reqRaveNumTwo}</ns3:RaveNum>") 
    def itemNode = nodeHolder.getDomNode("//ns3:RaveNum") 
    // import the node 
    def secondRaveNumNode = parentNode.getOwnerDocument().importNode(itemNode,false) 
    // and finally append it 
    parentNode.appendChild(secondRaveNumNode) 
} 

вместо:

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def secondRaveNumNode = new XmlSlurper(false,false).parseText("""<ns3:RaveNum>${reqRaveNumTwo}</ns3:RaveNum>""") 
    parentNode.appendNode(secondRaveNumNode) 
} 

Этот код с помощью XmlBeans для создания новый узел выглядит менее интуитивно, но таким образом он работает :).

Кроме того, я видел это в вашем коде: def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context), я полагаю, что это только typo однако он должен быть def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)

Надеется, что это помогает,

+0

Благодарю вас за то, что указали мне в правильном направлении! Теперь это имеет смысл. – ssc

+0

@ssc приятно помочь вам :) – albciff

0

Кодекс был обновлен, как показано ниже, чтобы получить его на самом деле работает:

/* Groovy Utilities Declaration */ 
def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context) 

/* Request Holder Setup */ 
def request  = context.expand('${RequestStepName#Request}') 
def requestHolder = groovyUtils.getXmlHolder("request") 

/* Declaring Namespaces */ 
requestHolder.namespaces["soapenv"] = "http://schemas.xmlsoap.org/soap/envelope/" 
requestHolder.namespaces["ns2"]  = "..." 
requestHolder.namespaces["ns3"]  = "..." 
requestHolder.namespaces["ns4"]  = "..." 

/* Set few string names */ 
def operXString   = "//ns2:OperationName" 
def raveNumXString  = "//ns3:RaveNum" 

/* create object of Request nodes */ 
def parentNode = requestHolder.getDomNode(operXString) 

def reqRaveNumTwo = "888" 

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def nodeHolder = groovyUtils.getXmlHolder("<ns3:RaveNum xmlns:ns3=\"ns3\">${reqRaveNumTwo}</ns3:RaveNum>") 
    def itemNode = nodeHolder.getDomNode(raveNumXString) 
    // import the node 
    def secondRaveNumNode = parentNode.getOwnerDocument().importNode(itemNode,false) 
    // and finally append it 
    parentNode.appendChild(secondRaveNumNode) 
} 

/* Update the request holder properties */ 
requestHolder.updateProperty(true) 
context.requestContent = requestHolder.xml 
Смежные вопросы