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

时间:2017-02-01 07:14:24

标签: xml xpath pentaho kettle spoon

我有一个要求,即传入的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并将其粉碎成数据库。 我正在使用&#39;获取XML数据&#39;用于读取XML的组件。 我已经定义了循环Xpath&#39;作为root / creditreport然后我逐个读取字段:

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

但问题是,它只会破坏第一行并错过第二行。我可以理解原因,因为XPATH循环只是直到。 如果我定义了&#39; xpath循环&#39; as&#39; root / creditreport / data3&#39;然后问题元素&data;数据3&#39;得到解决,但还有其他元素可以重复,然后我会再次站在问题的起点。

任何建议!!

1 个答案:

答案 0 :(得分:2)

如果父(dataX)和子节点(A,B,C等)都是唯一的/顺序的,你可以做一个非常通用的设置:

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

手动设置这样的字段:

Field definitions in Get Data from XML

这应该会得到这样的输出:

Output sample

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

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

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

enter image description here

enter image description here