如何合并两个 XML 变量
How do I merge two XML variables
分散-收集的输出是两个变量,具有相同格式的 XML 文件。我现在需要将这两个文件合并为一个。实验和搜索没有找到任何合并两个 XML 文件的示例代码。
输入 1 来自一个报告过程,输入 2 来自另一个报告。除“TYPE”参数外,格式始终相同。我想删除“DATE”行并合并所有记录。
输入 1:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
</DATA>
输入 2:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>
假设您有包含 2 个有效负载的分散-聚集响应,您可以使用如下内容:
{ DATA:
(payload[0].payload.DATA ++ payload[1].payload.DATA) - "DATE"
}
由于 XML 被视为一个对象,每个标签都是一个可以重复的属性,我正在做的是加入两个 DATA 对象属性,然后删除 DATE 属性。然后,我将它包装在一个新的 DATA 根对象中。
正如您在问题中提到的,我将您的输入作为 DataWeave 中的一个变量,
(如果 它不是来自 Scatter-Gather 的变量 ,那么只需调整 DWL 代码并直接从有效负载获取输入作为有效负载 [0].payload.DATA.*RECORD 和payload[1].payload.DATA.*RECORD)
在你的分散-聚集之后使用下面的代码,它会删除“DATE”参数,而且如果“type”参数没有出现也不会产生任何影响
如果任何变量为空,也处理 NULL
%dw 2.0
output application/xml
var input1 = read('<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
</DATA>','application/xml')
var input2 = read('<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>','application/xml')
---
{
DATA : RECORD : (input1.DATA.*RECORD default []) ++ (input2.DATA.*RECORD default [])
}
输出:
<?xml version='1.0' encoding='UTF-8'?>
<DATA>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>
我也在此处展示如何使用 DWL
在变量中读取 XML
分散-收集的输出是两个变量,具有相同格式的 XML 文件。我现在需要将这两个文件合并为一个。实验和搜索没有找到任何合并两个 XML 文件的示例代码。
输入 1 来自一个报告过程,输入 2 来自另一个报告。除“TYPE”参数外,格式始终相同。我想删除“DATE”行并合并所有记录。
输入 1:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
</DATA>
输入 2:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>
假设您有包含 2 个有效负载的分散-聚集响应,您可以使用如下内容:
{ DATA:
(payload[0].payload.DATA ++ payload[1].payload.DATA) - "DATE"
}
由于 XML 被视为一个对象,每个标签都是一个可以重复的属性,我正在做的是加入两个 DATA 对象属性,然后删除 DATE 属性。然后,我将它包装在一个新的 DATA 根对象中。
正如您在问题中提到的,我将您的输入作为 DataWeave 中的一个变量, (如果 它不是来自 Scatter-Gather 的变量 ,那么只需调整 DWL 代码并直接从有效负载获取输入作为有效负载 [0].payload.DATA.*RECORD 和payload[1].payload.DATA.*RECORD)
在你的分散-聚集之后使用下面的代码,它会删除“DATE”参数,而且如果“type”参数没有出现也不会产生任何影响
如果任何变量为空,也处理 NULL
%dw 2.0
output application/xml
var input1 = read('<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
</DATA>','application/xml')
var input2 = read('<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATE>2021-03-02T00:00:01.000+00:00</DATE>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>','application/xml')
---
{
DATA : RECORD : (input1.DATA.*RECORD default []) ++ (input2.DATA.*RECORD default [])
}
输出:
<?xml version='1.0' encoding='UTF-8'?>
<DATA>
<RECORD>
<ADDRESS>4006 Viking Drive</ADDRESS>
<CITY>GLOVERVILLE</CITY>
<STATE>SC</STATE>
<ZIP>29828</ZIP>
<NAME>Mickey</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2279 Oak Street</ADDRESS>
<CITY>ROCKVILLE</CITY>
<STATE>MD</STATE>
<ZIP>20851</ZIP>
<NAME>Donald</NAME>
<TYPE>This Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>2759 Drainer Avenue</ADDRESS>
<CITY>Tallahassee</CITY>
<STATE>FL</STATE>
<ZIP>32301</ZIP>
<NAME>Goofy</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
<RECORD>
<ADDRESS>3352 Limer Street</ADDRESS>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>30303</ZIP>
<NAME>Pluto</NAME>
<TYPE>A Different Type</TYPE>
</RECORD>
</DATA>
我也在此处展示如何使用 DWL
在变量中读取 XML