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

为此,我创建了一个简单的结构:
在xmlfileinput中,这是配置:
如果付款是单据
在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中是可能的。看看我提出的解决方案:
我的输出基于您的输入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的expressions字段:[row2.doc:/report/payment/reference[@type=1]/@value]中,但是由于附加的括号,我的作业将不再生成

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

10-10 09:10