我正在尝试使用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语句输入中使用,以将代码插入到我选择的所有节点中?
(我认为与比较字段的复杂连接是合适的,因为我没有任何可比性的东西。)
答案 0 :(得分:0)
是的,您可以重复阅读XML节点。检查一下:How to extract XML node values and from recurring nodes in pentaho?解决方案。您需要在Fields Section中正确定义XPATH。在这里使用“。”(点)非常重要。
现在针对您的问题,您需要应用与上述相同的逻辑,但稍作修改。检查下图:
我在这里做的是:
首先,获取Rootnode
结构,我将使用它来加入(图像中ktr的第一行)
其次,我按照上述链接中的解释,以一种复古的方式阅读所有Node
。检查下图:
newField
作为节点名称。 在“添加XML”部分中,将此新字段添加到Node
部分。
//Rootnode
。这将加入来自“第1点”的Rootnode
。
最后生成XML输出(target.xml)。
如上所述,我已经放置了{。3}的.ktr。请看看。
注意:source.xml文件与问题中的相同。
处理复杂的XML结构:
正如下面的评论中所强调的,上述方法在处理复杂的xml结构时会失败。因此,为了实现这一点,我们需要使用“XML输入流(StAX)”步骤,该步骤使用StAX解析器轻松读取复杂的XML结构。
我在gist中记录了相同的内容以及要点。请检查一下!!我认为这也适用于您的数据集。
希望有所帮助:)