Pentaho PDI - XML Join步骤的XPath语法

时间:2015-02-25 15:47:48

标签: xml xpath pentaho kettle pdi

我正在尝试使用Pentaho PDI在带有“添加XML”步骤的转换中加入xml代码,该步骤添加一些字段,其中“Root XML Element”设置为“Node”(如下所示)和“XML Join”步骤

我想在每个“节点”中插入一些具有相同数据的字段。

<Rootnode>
 <Node>
 <Node>
 <Node>
</Rootnode>

问题是,无论我尝试什么XPath表达式,我想插入的字段只插入第一个节点。 “RootNode / Node”或“// Node”等表达式无效。

这是我得到的结果:

<RootNode>
   <Node>
    <inserted field>
  <Node>
  <Node>
</RootNode>

这就是我想要的:

<RootNode>
  <Node>
    <inserted field>
  <Node>
    <inserted field>
  <Node>
    <inserted field>
</RootNode>

问题:XML-join步骤是否只能将代码连接到一个显式指定的节点,或者是否有一个XPath-expression我可以在XML-join步骤的XPath语句输入中使用,以将代码插入到我选择的所有节点中?

(我认为与比较字段的复杂连接是合适的,因为我没有任何可比性的东西。)

1 个答案:

答案 0 :(得分:0)

是的,您可以重复阅读XML节点。检查一下:How to extract XML node values and from recurring nodes in pentaho?解决方案。您需要在Fields Section中正确定义XPATH。在这里使用“。”(点)非常重要。

现在针对您的问题,您需要应用与上述相同的逻辑,但稍作修改。检查下图:

enter image description here

我在这里做的是:

  1. 首先,获取Rootnode结构,我将使用它来加入(图像中ktr的第一行)

  2. 其次,我按照上述链接中的解释,以一种复古的方式阅读所有Node。检查下图:

  3. enter image description here

    1. 添加常量字段。这是您的新Field Node。我使用newField作为节点名称。
    2. 在“添加XML”部分中,将此新字段添加到Node部分。

      1. XML加入:在此步骤中,将加入条件设为//Rootnode。这将加入来自“第1点”的Rootnode
      2. enter image description here

        1. 最后生成XML输出(target.xml)

          enter image description here

        2. 如上所述,我已经放置了{。3}的.ktr。请看看。

          注意:source.xml文件与问题中的相同。


          处理复杂的XML结构:

          正如下面的评论中所强调的,上述方法在处理复杂的xml结构时会失败。因此,为了实现这一点,我们需要使用“XML输入流(StAX)”步骤,该步骤使用StAX解析器轻松读取复杂的XML结构。

          我在gist中记录了相同的内容以及要点。请检查一下!!我认为这也适用于您的数据集。

          希望有所帮助:)