Замените узел в XML с помощью скрипта groovy

#xml #groovy

Вопрос:

Мне нужна помощь в замене XML-узла с помощью заводного скрипта. Каждый lt;document_owner__cgt;lt;valuegt;9231799lt;/valuegt;lt;/document_owner__cgt; из них должен быть заменен на lt;Managergt;1234lt;/Managergt; . Ниже приведен пример ввода и требуемых выходных данных.

Ввод:

 lt;?xml version='1.0' encoding='UTF-8'?gt;  lt;rootgt;  lt;rowgt;  lt;idgt;728lt;/idgt;  lt;document_owner__cgt;  lt;valuegt;9231799lt;/valuegt;  lt;/document_owner__cgt;  lt;/rowgt;  lt;rowgt;  lt;idgt;713lt;/idgt;  lt;document_owner__cgt;  lt;valuegt;9231799lt;/valuegt;  lt;/document_owner__cgt;  lt;/rowgt;  lt;rowgt;  lt;idgt;707lt;/idgt;  lt;document_owner__cgt;  lt;valuegt;9231799lt;/valuegt;  lt;/document_owner__cgt;  lt;/rowgt;  lt;/rootgt;  

Требуемая Производительность:

 lt;?xml version='1.0' encoding='UTF-8'?gt;  lt;rootgt;  lt;rowgt;  lt;idgt;728lt;/idgt;  lt;Managergt;1234lt;Managergt;  lt;/rowgt;  lt;rowgt;  lt;idgt;713lt;/idgt;  lt;Managergt;1234lt;Managergt;  lt;/rowgt;  lt;rowgt;  lt;idgt;707lt;/idgt;  lt;Managergt;1234lt;Managergt;  lt;/rowgt;  lt;/rootgt;  

Комментарии:

1. Вам нужен классный скрипт или ванильный XSLT? Что вы пробовали до сих пор?

2. Почему это нужно делать с помощью Groovy вместо DataWeave, который встроен в Mule?

3. Также описание неверно. На основе примера, которым вы хотите заменить элемент document_owner__c lt;Managergt;1234lt;Managergt; .

4. привет, мне нужен отличный скрипт для этого требования

Ответ №1:

Вот решение с использованием DataWeave. Я написал параметризованную функцию, которая рекурсивно преобразует нужный ключ и заменяет его новым элементом, который является объектом в типах DataWeave.

 %dw 2.0 output application/xml fun replaceElement(originalObject, key, newObject)=  originalObject match {  case is Object -gt; originalObject mapObject (if($ as String == key) newObject else ($): replaceElement($, key, newObject))  else -gt; $  } --- replaceElement(payload, "document_owner__c", {Manager: "1234"})  

Ответ №2:

У нас есть работающая работа Дженкинса, которая делает нечто подобное. Я извлек из него некоторый код и изменил его для вашего сценария. Вот классный сценарий:

 import groovy.xml.XmlUtil import groovy.xml.StreamingMarkupBuilder  def oldXml = """ lt;rootgt;  lt;rowgt;  lt;idgt;728lt;/idgt;  lt;document_owner__cgt;  lt;valuegt;9231799lt;/valuegt;  lt;/document_owner__cgt;  lt;/rowgt;  lt;rowgt;  lt;idgt;713lt;/idgt;  lt;document_owner__cgt;  lt;valuegt;9231799lt;/valuegt;  lt;/document_owner__cgt;  lt;/rowgt;  lt;rowgt;  lt;idgt;707lt;/idgt;  lt;document_owner__cgt;  lt;valuegt;9231799lt;/valuegt;  lt;/document_owner__cgt;  lt;/rowgt; lt;/rootgt; """  def root = new XmlSlurper().parseText(oldXml) root.row  .findAll {it.document_owner__c.value.text().equals('9231799') }  .document_owner__c  .replaceNode { Manager("1234") }  def newXml = XmlUtil.serialize(new StreamingMarkupBuilder().bind {mkp.yield root})  println newXml  

Выход:

 lt;?xml version="1.0" encoding="UTF-8"?gt;lt;rootgt;  lt;rowgt;  lt;idgt;728lt;/idgt;  lt;Managergt;1234lt;/Managergt;  lt;/rowgt;  lt;rowgt;  lt;idgt;713lt;/idgt;  lt;Managergt;1234lt;/Managergt;  lt;/rowgt;  lt;rowgt;  lt;idgt;707lt;/idgt;  lt;Managergt;1234lt;/Managergt;  lt;/rowgt; lt;/rootgt;