#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;