Home > Blockchain >  Dataweave 2.0 - How to inject an additional XML element in to an existing XML structure
Dataweave 2.0 - How to inject an additional XML element in to an existing XML structure

Time:10-17

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>
  • Related