Talend tXMLMap可以在不循环的情况下获取所有元素

时间:2014-10-13 10:26:22

标签: xml csv talend

我正在学习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

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

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

没有参考的元素没有行。

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

虽然我没有完成,但我认为这可能是一条路。但是参考并不是我需要的唯一元素。 在真正的xml中我发现了很多元素,而像这样的中间表的数量会很大。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好消息:使用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]但是由于附加括号,我的工作不再生成了< / p>