Pentaho中的XML CHild节点迭代

时间:2013-04-23 14:27:58

标签: xml loops etl pentaho kettle

我有一个 XML 文件,其格式为数据:

<LineHeader>
  <LineItem LineNumber="1">
    <Product SKU="99991L" DespatchQuantity="70">
      <Item Type="EANCode">0821793005795</Item>
      <SKUDescription1>HTC SNAP SYST</SKUDescription1>
      <SKUDescription2 />
      <SerialNumberHeader>
        <SerialNumber>358991022404733</SerialNumber>
        <SerialNumber>358991022404808</SerialNumber>
      </SerialNumberHeader>
    </Product>
  </LineItem>
  <LineItem LineNumber="2">
    <Product SKU="37099M" DespatchQuantity="50">
      <Item Type="EANCode">0843163067660</Item>
      <SKUDescription1>RIM KEPLER SYST</SKUDescription1>
      <SKUDescription2 />
      <SerialNumberHeader>
        <SerialNumber>353933040011632</SerialNumber>
        <SerialNumber>353933042759923</SerialNumber>
      </SerialNumberHeader>
    </Product>
  </LineItem>
</LineHeader>

现在我希望输出成为一个文本文件,其中包含列名和记录,如下所示:

LineItem 
LineNumber  Product SKU EANCode         SKUDescription1   SerialNumber
1           99991L      821793005795    HTC SNAP SYST     358991022404808
1           99991L      821793005795    HTC SNAP SYST     358991022434987
1           99991L      821793005795    HTC SNAP SYST     358991022435505
2           37099M      843163067660    RIM KEPLER SYST   353933040011632
2           37099M      843163067660    RIM KEPLER SYST   353933042759923

输出数据应如上表所示。 我们如何在 pentaho 中实现循环。

2 个答案:

答案 0 :(得分:3)

假设你想为每个序列号输出一行输出(问题显示五行输出,但我认为你的意思是四个):

Get XML Data步骤

Content标签

将Loop XPath设置为/LineHeader/LineItem/Product/SerialNumberHeader

Fields标签

Name            XPath                 Element
LineNumber      ../../../LineNumber   Attribute
Product SKU     ../../SKU             Attribute
EANCode         ../../Item            Node
SKUDescription1 ../../SKUDescription1 Node
SerialNumber    .                     Node

将输出

LineNumber Product SKU           EANCode SKUDescription1 SerialNumber
1          99991L  0821793005795 HTC     SNAP SYST       358991022404733
1          99991L  0821793005795 HTC     SNAP SYST       358991022404808
2          37099M  0843163067660 RIM     KEPLER SYST     353933040011632
2          37099M  0843163067660 RIM     KEPLER SYST     353933042759923

HTH!

答案 1 :(得分:0)

正如我所看到的,这里的基本问题是ETL工具旨在处理表格数据,而不是分层数据。试图做到这一点就像强迫一个方形的钉子进入一个圆孔。你可能能够完成一次或两次,但它不会很漂亮,它会很容易破坏,而且肯定不会重复使用。

使用StAX输入步骤的samples目录中有一个示例转换来执行此操作。它被称为'XML输入流(StAX)测试4 - Hierarchies.ktr'。但是请注意,PDI人员使用UDJC来构建层次结构。

我已经把你的例子弄乱了一段时间了,我找不到一个优雅的方法来完成转换。我认为编写脚本是你最好的选择。

编辑 -

您知道,这可能是自定义控件的一个很好的应用程序。可以将XML文档映射到表格数据,就像您想要输出的那样。我怀疑这是一个常见的问题;我想知道Matt&amp;公司有这样的计划。