1

已编辑...我在 Groovy 方面的知识是基本的,我需要执行以下操作,但我不知道该怎么做。

假设我有这个 XML:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <ns2:analyzeEffectOfReplaceOfferResponse>
      <ns2:productOfferings>
        <ns2:productOffering xsi:type="ns2:ProductOfferingInstanceCore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <ns2:opExtn>C_P87531945-0993-46d1-8f23-ed23caa6e0cf</ns2:opExtn>
           <ns2:productOffering>
              <ns9:id>8447669</ns9:id>
           </ns2:productOffering>
           <ns2:productOffering>
              <ns9:id>8447100</ns9:id>
           </ns2:productOffering>
        </ns2:productOffering>
     </ns2:productOfferings>
  </ns2:analyzeEffectOfReplaceOfferResponse>
</soap:Body>
</soap:Envelope>

给定一个 XPath 表达式,如:

/Body/analyzeEffectOfReplaceOfferResponse/productOfferings/productOffering/productOffering

和 GPathResult 为:

gpathRequest = new XmlSlurper().parse(inputFile)

我知道如何使用 findAll 来搜索所有相关的标签。假设我将 Xpath 存储在 xPath 变量中:

def gpath = "XML." + xPaths
child = Eval.me( 'XML', gpathRequest, gpath ).depthFirst().findAll{it.value}

但是我不确定如何以收集的形式处理这里的结果。找到我需要的结果后如何添加新属性?

4

1 回答 1

1

您可以创建新产品列表并循环遍历列表以添加新productOffering节点。

不需要使用xpath。而是找到父节点productOfferingsappendNode用于实现相同的目的。

请参阅以下脚本:

def newOfferings = [8447101, 8447102]

def xml = new XmlSlurper().parse(inputFile)

def offerings = xml.'**'.find{it.name() == 'productOfferings'}

newOfferings.each { val ->
   offerings.appendNode {
       'ns2.productOffering' {
          'ns9.id'(val)
       }
   }
}

您可以在线快速尝试相同的demo

于 2018-02-26T17:31:08.543 回答