如何循环遍历 XML 中的元素以分解并加载到数据库

问题描述 投票:0回答:2

我有一个要求,传入的 XML 必须被分解并加载到数据库中。 所有元素都有各自的表格。 传入的 XML 看起来像这样:

<root>
  <creditreport>
    <data1>
      <A>val1</A>
      <B>val2</B>
    </data1>
    <data2>
      <C>val3</C>
      <D>val4</D>
    </data2>
    <data3>
     <E>val5</E>
     <F>val6</F>
    </data3>
    <data3>
     <G>val7</G>
     <H>val8</H>
    </data3>
  </creditreport>
</root>

现在在 Kettle 中,我正在设计一个通用框架,它可以获取 XML 并将其分解到数据库中。 我正在使用“获取 XML 数据”组件来读取 XML。 我已将“循环 Xpath”定义为 root/creditreport,然后我将字段一一读取为:

name   xpath   Element  ResultType 
 A      data1   Node     Valueof 
 B      data1   Node     Valueof 
 ..... 
 .....
 .....
 E     data3    Node     Valueof
 .....
 ..... 
 G     data3    Node     Valueof

但问题是,它只粉碎了第一行并丢失了第二行。我可以理解原因,因为 XPATH 循环仅到 。 如果我将“xpath循环”定义为“root/creditreport/data3”,那么元素“data3”的问题就得到解决,但还有其他元素也可以重复,然后我将再次站在问题的起点。

有什么建议吗!!

xml xpath pentaho kettle spoon
2个回答
2
投票

如果父节点(dataX)和子节点(A、B、C 等)确实是唯一/连续的,您可以进行一个非常通用的设置:

使用

/root/creditreport/*/*
作为 xpath 循环路径

手动设置这样的字段:

这应该给你一个像这样的输出:

从这里您可以根据需要对数据进行非规范化或其他处理。请注意,我已经为父级别的节点添加了序列号,因此您可以区分第一个 Data3 和第二个,等等。

另一方面,如果您的 dataX 节点都具有相同的子节点(A、B A、B 而不是 A、B C、D 等),您可以使用

/root/creditreport/*
作为 xpath 循环路径并跳过父节点字段,配置通常你的值节点 A 和 B。

以下是定义和输出。所有字段都是相对于当前节点 (.) 定义的。


0
投票

我也有同样的问题。如何在 Loop xpath 中循环 xml 元素。 可以请指教吗

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.