是否可以使用 mule 中的 Dataweave 或 Damapper 从基于订单项的复杂输入 xml 生成多个 XML?
Is it possible to generate multiple XML from a complex input xml based on line items using Dataweave or Damapper in mule?
我试图根据输入 XML 中的行项目创建多个平面 XML。这可能只是在 mule 中使用 Dataweave 或 Datamapper 吗?
谢谢
请看上面的例子
<?xml version="1.0" encoding="utf-8"?>
<XmlInterchange>
<InterchangeInfo>
<Payload>
<WhsDockets>
<WhsDocket>
<Identifier>1</Identifier>
<DocketDetail>
</DocketDetail>
<DocketLines>
<Product>7CAGL3G00</Product>
<Description>AGL_7C_0</Description>
<QuantityFromClientOrder>7.00</QuantityFromClientOrder>
<QuantityActuallyOrdered>7.00</QuantityActuallyOrdered>
<ProductUQ>SKD</ProductUQ>
<Confirmation>
<Lines>
<Line>
<PartAttribute1>4440_100</PartAttribute1>
<PartAttribute2>96489</PartAttribute2>
<PartAttribute3>700029611 - 700029710 #4</PartAttribute3>
<Quantity>100.000</Quantity>
<QuantityUQ>UNT</QuantityUQ>
</Line>
<Line>
<PartAttribute1>4440_100</PartAttribute1>
<PartAttribute2>96489</PartAttribute2>
<PartAttribute3>700029511 - 700029610 #3</PartAttribute3>
<Quantity>100.000</Quantity>
<QuantityUQ>UNT</QuantityUQ>
</Line>
</Lines>
</Confirmation>
</DocketLines>
<WhsDocket>
<WhsDockets>
<Payload>
</InterchangeInfo>
</XmlInterchange>
目标
<?xml version="1.0"?><p1:StockMovementDataRequest xmlns:p1="urn:ams.com.au:test:3pl:am:SAP_AM_I_005:StockMovement" xmlns:a="http://www.test.com.au/EnterpriseService/">
<Header>
<From>warehouse</From>
<To>client</To>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<From_Location>warehouse</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029611 - 700029710 #4</>
<Quantity>7.00</Quantity>
</StockMovementData>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<From_Location>warehouse</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029511 - 700029610 #3</>
<Quantity>7.00</Quantity>
</StockMovementData>
或使用订单项
创建多个XML
单个 DataWeave 转换只能输出一个 xml 文件,请记住 XML 可以有 ONLY ONE ROOT element。如果您的转换导致多个根元素,DataWeave 也会抛出错误。所以你不能以你在问题中提到的格式生成单个 xml 。但是,如果您可以将所有输出元素包装到某个根元素中,那么您就可以创建该输出。
添加更新展示,如何迭代和生成元素-
我们需要借助全局函数来创建长度等于订购数量的动态数组 -
在你的 mule xml -
下方添加 global function
<configuration doc:name="Configuration">
<expression-language>
<global-functions>
def getArrayOfLength(value){
int i = 0;
int[] arrRet = [];
while(i < value){
arrRet.add(i);
i++;
}
return arrRet;
}
</global-functions>
</expression-language>
</configuration>
然后我们将在我们的数据编织中使用这个函数,我将使用一个简单的输入 xml 如下所示,并将在 -
中输出名称元素的次数
<?xml version='1.0' encoding='UTF-8'?>
<root>
<name>Manik</name>
<times>7</times>
</root>
然后是dataweave代码-
%dw 1.0
%output application/xml
---
{
root: {
(getArrayOfLength(payload.root.times) map ((key,index) -> name: payload.root.name))
}
}
所以我们要做的是,通过传入时间值来调用我们的全局函数,例如。 7. 这个全局函数会return一个从0开始到value-1的数组列表。然后我们使用 map
遍历这个数组,但我们没有使用这个数组中的任何东西,相反,我们可以只使用我们的原始有效负载来创建将在输出中重复 N 次的映射。
这是输出 -
<?xml version='1.0' encoding='windows-1252'?>
<root>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
</root>
希望这能让您了解如何做并帮助您针对您的用例扩展它。
我试图根据输入 XML 中的行项目创建多个平面 XML。这可能只是在 mule 中使用 Dataweave 或 Datamapper 吗?
谢谢
请看上面的例子
<?xml version="1.0" encoding="utf-8"?>
<XmlInterchange>
<InterchangeInfo>
<Payload>
<WhsDockets>
<WhsDocket>
<Identifier>1</Identifier>
<DocketDetail>
</DocketDetail>
<DocketLines>
<Product>7CAGL3G00</Product>
<Description>AGL_7C_0</Description>
<QuantityFromClientOrder>7.00</QuantityFromClientOrder>
<QuantityActuallyOrdered>7.00</QuantityActuallyOrdered>
<ProductUQ>SKD</ProductUQ>
<Confirmation>
<Lines>
<Line>
<PartAttribute1>4440_100</PartAttribute1>
<PartAttribute2>96489</PartAttribute2>
<PartAttribute3>700029611 - 700029710 #4</PartAttribute3>
<Quantity>100.000</Quantity>
<QuantityUQ>UNT</QuantityUQ>
</Line>
<Line>
<PartAttribute1>4440_100</PartAttribute1>
<PartAttribute2>96489</PartAttribute2>
<PartAttribute3>700029511 - 700029610 #3</PartAttribute3>
<Quantity>100.000</Quantity>
<QuantityUQ>UNT</QuantityUQ>
</Line>
</Lines>
</Confirmation>
</DocketLines>
<WhsDocket>
<WhsDockets>
<Payload>
</InterchangeInfo>
</XmlInterchange>
目标
<?xml version="1.0"?><p1:StockMovementDataRequest xmlns:p1="urn:ams.com.au:test:3pl:am:SAP_AM_I_005:StockMovement" xmlns:a="http://www.test.com.au/EnterpriseService/">
<Header>
<From>warehouse</From>
<To>client</To>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<From_Location>warehouse</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029611 - 700029710 #4</>
<Quantity>7.00</Quantity>
</StockMovementData>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<From_Location>warehouse</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029511 - 700029610 #3</>
<Quantity>7.00</Quantity>
</StockMovementData>
或使用订单项
创建多个XML单个 DataWeave 转换只能输出一个 xml 文件,请记住 XML 可以有 ONLY ONE ROOT element。如果您的转换导致多个根元素,DataWeave 也会抛出错误。所以你不能以你在问题中提到的格式生成单个 xml 。但是,如果您可以将所有输出元素包装到某个根元素中,那么您就可以创建该输出。
添加更新展示,如何迭代和生成元素-
我们需要借助全局函数来创建长度等于订购数量的动态数组 -
在你的 mule xml -
下方添加 global function<configuration doc:name="Configuration">
<expression-language>
<global-functions>
def getArrayOfLength(value){
int i = 0;
int[] arrRet = [];
while(i < value){
arrRet.add(i);
i++;
}
return arrRet;
}
</global-functions>
</expression-language>
</configuration>
然后我们将在我们的数据编织中使用这个函数,我将使用一个简单的输入 xml 如下所示,并将在 -
中输出名称元素的次数<?xml version='1.0' encoding='UTF-8'?>
<root>
<name>Manik</name>
<times>7</times>
</root>
然后是dataweave代码-
%dw 1.0
%output application/xml
---
{
root: {
(getArrayOfLength(payload.root.times) map ((key,index) -> name: payload.root.name))
}
}
所以我们要做的是,通过传入时间值来调用我们的全局函数,例如。 7. 这个全局函数会return一个从0开始到value-1的数组列表。然后我们使用 map
遍历这个数组,但我们没有使用这个数组中的任何东西,相反,我们可以只使用我们的原始有效负载来创建将在输出中重复 N 次的映射。
这是输出 -
<?xml version='1.0' encoding='windows-1252'?>
<root>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
<name>Manik</name>
</root>
希望这能让您了解如何做并帮助您针对您的用例扩展它。