मैं सिर्फ एक साधारण नोड की प्रतिलिपि बनाने और उसका नाम बदलने के लिए सोपूआई में ग्रोवी स्क्रिप्ट का उपयोग करना चाहता हूं। लेकिन मुझे ऐसा करने के बारे में कोई जानकारी नहीं है।

इनपुट एक्सएमएल इस तरह है:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <a>
      <aa>...</aa>
    </a>
    <a>
      <aa>...</aa>
    </a>
    <b>
      <bb>...</bb>
    </b>
    <b>
      <bb>..</bb>
    </b>
  </soap:Body>

मुझे बस प्रत्येक <b> के लिए <bb> को <bb2> में कॉपी करने की आवश्यकता है:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <a>
      <aa>...</aa>
    </a>
    <a>
      <aa>...</aa>
    </a>
    <b>
      <bb>...</bb>
      <bb2>...</bb2>
    </b>
    <b>
      <bb>..</bb>
      <bb2>...</bb2>
    </b>
  </soap:Body>

चूंकि कई "बी" फ़ील्ड हैं, मैं XPath ट्रांसफॉर्मेशन के साथ संपत्ति हस्तांतरण का उपयोग नहीं कर सकता, इसलिए मुझे ग्रोवी स्क्रिप्ट का उपयोग करने की आवश्यकता है, लेकिन मुझे उस विशिष्ट उद्देश्य पर कोई मदद नहीं मिलती है।

क्या कोई मुझे कुछ संकेत दे सकता है?

मैंने डैगेट उत्तर के साथ प्रयास किया है लेकिन मेरा इनपुट एक सोपूआई अनुरोध/प्रतिक्रिया है।

def requestHolder = groovyUtils.getXmlHolder( "WSCall#Request" )

def xclone(Node n){
  return new XmlParser().parseText(XmlUtil.serialize(n))
}

for( item in requestHolder.getDomNodes( "//b" )){
  item.depthFirst().each{e->
    if(e.name()=='bb'){
      def e2 = xclone(e)
      e2.name = 'bb2'
      e.parent()?.append( e2 )
    }
  }
}

लेकिन मुझे एक groovy.lang.MissingMethodException: No signature of method: org.apache.xmlbeans.impl.store.Xobj$ElementXobj.depthFirst() is applicable for argument types: () values: [] error at line: 34 मिलता है

साथ

requestHolder.getDomNodes( "//b" ).each{e->
  if(e.name()=='bb'){
    def e2 = xclone(e)
    e2.name = 'bb2'
    e.parent()?.append( e2 )
  }
}

मुझे एक groovy.lang.GroovyRuntimeException: Cannot read write-only property: name मिलता है

0
Alexa 17 मई 2018, 10:47

1 उत्तर

सबसे बढ़िया उत्तर
import groovy.xml.XmlUtil

def root = new XmlParser().parseText('''<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <a>
      <aa>...</aa>
    </a>
    <b>
      <bb>111</bb>
    </b>
    <b>
      <bb><cc>222</cc></bb>
    </b>
</soap:Body>
</soap:Envelope>''')

def xclone(Node n){
    return new XmlParser().parseText(XmlUtil.serialize(n))
}

root.depthFirst().each{e->
    if(e.name()=='bb'){
        def e2 = xclone(e)
        e2.name = 'bb2'
        e.parent()?.append( e2 )
    }
}

println XmlUtil.serialize(root)

परिणाम

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <a>
      <aa>...</aa>
    </a>
    <b>
      <bb>111</bb>
      <bb2>111</bb2>
    </b>
    <b>
      <bb>
        <cc>222</cc>
      </bb>
      <bb2>
        <cc>222</cc>
      </bb2>
    </b>
  </soap:Body>
</soap:Envelope>
1
daggett 17 मई 2018, 12:13