Dataweave 2.0 - 如何将额外的 XML 元素注入到现有的 XML 结构中

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

我正在尝试找出如何在 dataweave 中执行此操作,但运气不佳。

是否有一种无需再次重建 XML 结构即可完成此操作的优雅方法?

给定以下源和目标示例,您将如何仅将新元素注入第一个 UserArea/PropertyList?

新元素:

 <Property>
    <NameValue name="new.attribute">new value</NameValue>
 </Property>

源结构

<?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>

目标结构

<?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>

您认为这是重建 xml 结构还是您的意思是在 DW 脚本中手工制作每个元素

输入 正如问题中给出的

脚本

%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 $)
})

输出

<?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>