0

我有一个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中实现循环。

4

2 回答 2

3

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

Get XML Data步骤

Content标签

将循环 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

于 2015-04-10T16:18:28.357 回答
0

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

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

我已经把你的例子弄乱了一段时间,我根本找不到一种优雅的方式来做转换。我认为脚本是你最好的选择。

编辑 -

你知道,这可能是自定义控件的一个很好的应用程序。一种将 XML 文档映射到您想要的输出的表格数据的方法。我怀疑这是一个常见问题;我想知道马特公司是否有类似的计划。

于 2013-05-16T23:49:00.767 回答