Pentaho Data Integration(简称PDI,社区俗称Kettle)在处理半结构化数据方面能力很强,其中“XML Input”和“Get data from XML”两个控件是读取XML文件的核心工具。很多初学者在第一次配置时会遇到字段取不到值、循环路径写错、命名空间解析失败等问题,其实大部分原因是对XPath的工作方式不够了解。本文结合具体的XML样例,完整演示从文件选择到字段映射的全过程。

一、准备示例XML并理解数据结构
假设我们有一份订单数据文件orders.xml,内容如下:
<orders>
<order id="1001">
<customer>张三</customer>
<amount>258.50</amount>
<items>
<item>
<name>机械键盘</name>
<qty>1</qty>
</item>
<item>
<name>无线鼠标</name>
<qty>2</qty>
</item>
</items>
</order>
<order id="1002">
<customer>李四</customer>
<amount>99.00</amount>
<items>
<item>
<name>USB数据线</name>
<qty>3</qty>
</item>
</items>
</order>
</orders>这份文件有两个层级:order层记录订单主信息,item层记录订单明细。Kettle的XML读取核心思路是“选定一个循环路径,把每个循环节点当作一行记录”。如果一份转换里既要订单主表又要明细表,就需要分别用两个“Get data from XML”控件,用不同的循环路径各读一次,再通过流查询(Stream Lookup)或表关联把数据拼起来。
动手前先在浏览器或文本编辑器里打开XML,数清楚每个层级下节点出现的次数,这一步能帮你快速确定循环路径应该写在<order>还是<item>上,避免后面反复返工。
二、配置Get data from XML控件
在Spoon界面新建一个转换,从“输入”分类中拖入“Get data from XML”(部分中文版本翻译为“从XML获取数据”),双击打开配置窗口。第一个标签页“文件”里,点击“浏览”选中orders.xml后点击“增加”,文件会出现在右侧的文件列表中。如果文件在服务器上,也可以在“文件或目录”里直接填入NFS挂载路径或HTTP地址。
第二个标签页“内容”是整个控件最关键的部分。“循环读取路径”决定了每一行数据的粒度。要读取订单主信息,填入:
/orders/order
注意路径必须以斜杠开头,从根节点开始写。如果只想读订单明细,循环路径改为/orders/order/items/item,此时每个item节点输出一行。
接着配置字段。点击“获取字段”按钮,Kettle会自动解析第一个循环节点下的子元素,生成字段列表。示例中会得到id、customer、amount三个字段。id是order节点的属性,在XPath列要写成@id;customer和amount是子元素,XPath列直接写元素名即可。列名和数据类型可以手动调整,比如把amount设为Number类型,格式填0.00。
如果需要同时取属性和子节点,字段表格的“XPath”列支持相对路径写法,例如items/item[1]/name表示取当前order节点下第一个item的名称。理解这一点后,即使不做流查询,也能通过数组下标的方式拿到部分明细字段,虽然灵活性不如真正的循环读取。
三、常见报错与进阶技巧
1. 命名空间导致的取值失败
很多接口返回的XML带有命名空间,比如<ns:order xmlns:ns="http://ippipp.com/order">。直接写/orders/order会取不到任何数据。解决办法有两个:一是在“内容”标签页勾选“忽略命名空间”选项,让Kettle按本地名称匹配节点;二是在XPath中使用通配符/*[local-name()='order']来匹配。推荐第一种,配置更简单,且对深层嵌套结构同样有效。
2. 循环路径正确但字段全为空
这种情况多半是字段表格里XPath写成了绝对路径。控件中的字段XPath必须相对于循环路径所在的节点,例如循环路径是/orders/order,那么customer字段的XPath应该是customer而不是/orders/order/customer。相对和绝对混用是新手最容易踩的坑。
3. 大文件与编码问题
处理几百兆的大XML时,可以在“内容”标签页设置“每次读取的行数”来控制内存占用,Kettle采用SAX方式流式解析,不会一次加载整个文件。编码方面,如果文件是GBK而控件默认UTF-8,中文会变成乱码,把“编码”下拉框改为GBK即可。建议先用“预览记录”功能看前100行数据是否正常,再接入后续步骤。
4. 结果落地
字段取出来之后,接一个“表输出”控件可以把数据写入MySQL、Oracle等数据库,接“文本文件输出”则生成CSV。对于订单主表和明细表的场景,常见做法是两条读取分支并行,主表分支输出到订单表,明细分支输出到明细表,明细分支额外用一个“增加常量”或“Get data from XML”的字段XPath技巧带上订单id,保证外键关联不丢失。
四、小结
Kettle读取XML的本质就是三步:确定循环路径决定行粒度、配置字段XPath决定列内容、处理命名空间和编码保证数据正确。掌握这三点后,不管是本地文件还是接口返回的XML报文,都能稳定地转换成结构化的行数据。建议在实际项目中养成先用“预览记录”验证配置的习惯,能在很大程度上减少调试时间。
Pentaho Data IntegrationKettleXML输入修改时间:2026-09-04 16:56:37