I'm trying to figure out how to do this in dataweave, but not having much luck.
Is there an elegant way to do this without having to rebuild the XML structures again?
Given the below source and target examples, how would you inject a new element into only the first UserArea/PropertyList?
New element:
<Property>
<NameValue name="new.attribute">new value</NameValue>
</Property>
Source structure
<?xml version="1.0" encoding="UTF-8"?>
<root>
<UserArea>
<PropertyList>
<Property>
<NameValue name="xxx.CreatedBy">Test 1</NameValue>
</Property>
<Property>
<NameValue name="xxx.EnteredBy">Test 2</NameValue>
</Property>
<Property>
<NameValue name="xxx.SafetyFlag">false</NameValue>
</Property>
<Property>
<NameValue name="xxx.DependFlag">true</NameValue>
</Property>
<Property>
<NameValue name="eam.UDFCHAR10">ABC</NameValue>
</Property>
</PropertyList>
</UserArea>
<UserArea>
<PropertyList>
<Property>
<NameValue name="xxx.Exited">Test 3</NameValue>
</Property>
<Property>
<NameValue name="xxx.Entered">Test 4</NameValue>
</Property>
<Property>
<NameValue name="xxx.SafetyFlag">false</NameValue>
</Property>
<Property>
<NameValue name="xxx.DependFlag">true</NameValue>
</Property>
<Property>
<NameValue name="eam.UDFCHAR10">ABC</NameValue>
</Property>
</PropertyList>
</UserArea>
</root>
Target Structure
<?xml version="1.0" encoding="UTF-8"?>
<root>
<UserArea>
<PropertyList>
<Property>
<NameValue name="xxx.CreatedBy">Test 1</NameValue>
</Property>
<Property>
<NameValue name="xxx.EnteredBy">Test 2</NameValue>
</Property>
<Property>
<NameValue name="xxx.SafetyFlag">false</NameValue>
</Property>
<Property>
<NameValue name="xxx.DependFlag">true</NameValue>
</Property>
<Property>
<NameValue name="xxx.UDFCHAR10">ABC</NameValue>
</Property>
<Property>
<NameValue name="new.attribute">new value</NameValue>
</Property>
</PropertyList>
</UserArea>
<UserArea>
<PropertyList>
<Property>
<NameValue name="xxx.Exited">Test 3</NameValue>
</Property>
<Property>
<NameValue name="xxx.Entered">Test 4</NameValue>
</Property>
<Property>
<NameValue name="xxx.SafetyFlag">false</NameValue>
</Property>
<Property>
<NameValue name="xxx.DependFlag">true</NameValue>
</Property>
<Property>
<NameValue name="xxx.UDFCHAR10">ABC</NameValue>
</Property>
</PropertyList>
</UserArea>
</root>
CodePudding user response:
Would you consider this as rebuilding the xml structure or did you mean handcrafting each element in DW script
Input As given in the question
Script
%dw 2.0
output application/xml
var newElementAdded = {"NameValue" @(name:"new.attribute"): "new value"}
---
root: (payload.root mapObject {
UserArea: (if(($$$) == 0) "PropertyList": $.PropertyList {"Property": newElementAdded} else $)
})
Output
<?xml version='1.0' encoding='UTF-8'?>
<root>
<UserArea>
<PropertyList>
<Property>
<NameValue name="xxx.CreatedBy">Test 1</NameValue>
</Property>
<Property>
<NameValue name="xxx.EnteredBy">Test 2</NameValue>
</Property>
<Property>
<NameValue name="xxx.SafetyFlag">false</NameValue>
</Property>
<Property>
<NameValue name="xxx.DependFlag">true</NameValue>
</Property>
<Property>
<NameValue name="eam.UDFCHAR10">ABC</NameValue>
</Property>
<Property>
<NameValue name="new.attribute">new value</NameValue>
</Property>
</PropertyList>
</UserArea>
<UserArea>
<PropertyList>
<Property>
<NameValue name="xxx.Exited">Test 3</NameValue>
</Property>
<Property>
<NameValue name="xxx.Entered">Test 4</NameValue>
</Property>
<Property>
<NameValue name="xxx.SafetyFlag">false</NameValue>
</Property>
<Property>
<NameValue name="xxx.DependFlag">true</NameValue>
</Property>
<Property>
<NameValue name="eam.UDFCHAR10">ABC</NameValue>
</Property>
</PropertyList>
</UserArea>
</root>