gpt4 book ai didi

xml - Talend tXMLMap 无需循环即可获取所有出现的元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:40:27 25 4
gpt4 key购买 nike

我正在学习 Talend,我需要一个 XML 到 CSV 的映射,但我无法正常工作。

我有一个这样的文档(非常简单):

<Report>
<Payment>
<Reference Type="1" Value="wathever11"/>
<Reference Type="2" Value="wathever12"/>
<Amount value="222"/>
</Payment>
<Payment>
<Reference Type="1" Value="wathever22"/>
<Reference Type="3" Value="wathever23"/>
<Amount value="123242"/>
</Payment>
<Payment>
<Reference Type="3" Value="wathever33"/>
<Reference Type="2" Value="wathever32"/>
<Amount value="12976"/>
</Payment>
<Payment>
<Reference Type="1" Value="wathever41"/>
<Reference Type="4" Value="wathever44"/>
<Amount value="1456"/>
</Payment>
<Payment>
<Amount value="12976"/>
</Payment>
</Report>

因此,我可以没有多个引用,最多可以有 4 个不同的类型。

我需要像这样将其转换为 CSV:

ReferenceType1, ReferenceType2, ReferenceType3, ReferenceType4, Amount
whatever11 , whatever12 , , , 222
, whatever22 , whatever23 , , 123242
, whatever32 , whatever33 , , 12976
whatever41 , , , whatever44 , 1456
, , , , 12976

为此,我创建了这个简单的结构:

Talend xml Map

在 XMLFileInput 中,这是配置: enter image description here

付款是文件

在 tXMLMap 中我设置了这样的文档结构:

Report
└──Payment (loop) First case, see below
├── Reference (loop) Second case, see below
| ├── @Type
| └── @Value
└── Amount
└── @Value

在输出表中,我使用如下表达式为每个引用创建一列:

[row1.Payment:/Payment/Reference/@Type].equals("1")? [row1.Payment:/Payment/Reference/@Value]: "" 

但是,我无法映射同一行中的所有引用。如果在支付级别设置循环,我得到这个:

ReferenceType1, ReferenceType2, ReferenceType3, ReferenceType4, Amount
whatever11 , , , , 222
, , , , 123242
, , , , 12976
whatever41 , , , , 1456
, , , , 12976

如果循环设置在引用级别,我会为每个引用获得一个新行,如下所示:

ReferenceType1, ReferenceType2, ReferenceType3, ReferenceType4, Amount
whatever11 , , , , 222
, whatever12 , , , 222
, whatever22 , , , 123242
, , whatever23 , , 123242
, , whatever33 , , 12976
, whatever32 , , , 12976
whatever41 , , , , 1456
, , , whatever44 , 1456

没有引用的元素没有行。

必须有一种方法可以达到预期的结果。我尝试创建一个中间步骤,将每个引用映射到不同的表以及一个序列号,以进一步将列合并为一行。

虽然我还没有完成,但我认为这可能是一条路要走。但是引用并不是我需要它的唯一元素。我得到了很多在真实 xml 中发生这种情况的元素,并且像这样的中间表的数量会很大。

所以我更愿意征求专家的意见,试图找到一种更简单的方法来做到这一点。

有什么想法吗?

最佳答案

好消息:这可以通过 tExtractXMLField 实现。查看我提出的解决方案:

job overview

tExtractXMLField

我的输出是基于您输入的 xml,但它与您预期的输出不同,请仔细检查:

.-------------------+-------------------+-------------------+-------------------+------.
| tLogRow_1 |
|=------------------+-------------------+-------------------+-------------------+-----=|
|referenceTypeValue1|referenceTypeValue2|referenceTypeValue3|referenceTypeValue4|amount|
|=------------------+-------------------+-------------------+-------------------+-----=|
|wathever11 |wathever12 |null |null |222 |
|wathever22 |null |wathever23 |null |123242|
|null |wathever32 |wathever33 |null |12976 |
|wathever41 |null |null |wathever44 |1456 |
|null |null |null |null |12976 |
'-------------------+-------------------+-------------------+-------------------+------'

坏消息:Talend 5.3.1 中的 tXMLMap 对我来说是不可能的。我试图将其放入 tXMLMap 的表达式字段中:[row2.doc:/Report/Payment/Reference[@Type=1]/@Value] 但是由于额外的括号,我的工作将不再生成

关于xml - Talend tXMLMap 无需循环即可获取所有出现的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com