我有一个要求,即传入的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;得到解决,但还有其他元素可以重复,然后我会再次站在问题的起点。
任何建议!!
答案 0 :(得分:2)
如果父(dataX)和子节点(A,B,C等)都是唯一的/顺序的,你可以做一个非常通用的设置:
使用/root/creditreport/*/*
作为xpath循环路径
手动设置这样的字段:
这应该会得到这样的输出:
从这里,您可以根据需要对数据进行非规范化处理或处理。请注意,我为父级别的节点添加了序列号,因此您可以将第一个Data3与第二个Data3区分开来,等等。
另一方面,如果您的dataX节点都具有相同的子节点(A,BA,B而不是A,BC,D等),则可以使用/root/creditreport/*
作为xpath循环路径并跳过父节点节点字段,正常配置节点A和B。
以下是定义和输出。所有字段都是相对于当前节点(。)定义的。