如何遍历 XML 中的元素以切碎并加载到数据库

How to loop through elements in XML to shred and load to database

我有一个要求,必须将传入的 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 并将其切碎到数据库中。 我正在使用 'Get XML Data' 组件来读取 XML。 我已将 'loop 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 loop' 定义为 'root/creditreport/data3',那么元素 'data3' 的问题就会得到解决,但也有其他元素可以重复,然后我将再次站在问题的起点。

有什么建议!!

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

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

像这样手动设置字段:

这应该让你得到这样的输出:

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

如果另一方面,您的 dataX 节点都具有相同的子节点(A、B A、B 而不是 A、B C、D 等),您可以使用 /root/creditreport/* 作为 xpath 循环路径并跳过父节点字段,正常配置你的值节点A和B。

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