kettle从入门到精通 第八十四课 ETL之kettle kettle中Get data from XML使用实战教程

场景:解析xml文件或者内容解析出其中某些字段。

 本来想着这个步骤使用起来比较简单,就没有梳理成文,结果群里的小伙伴为了使用这个步骤折腾了一下午。故有了此文。

在开始学习之前我们一起来学习下xml命名空间的相关知识,为下文展开做基础铺垫。

1、xml命名空间

XML 的命名空间(namespace)是为了解决在 XML 文档中使用相同元素或属性名称时可能出现的冲突问题。它提供了一种机制来区分和唯一标识不同来源的元素和属性,从而避免命名冲突。

文档1(未使用命名空间)

<book>
    <title>Introduction to XML</title>
    <value>123</value>
</book>

文档2(未使用命名空间)

<product>
    <name>XML Book</name>
    <value>$50</value>
</product>

在文档1和文档2中,<value> 元素在两个文档中都有定义,但它们的含义是不同的。在没有命名空间的情况下,如果你尝试将这两个文档合并,或者在处理它们时可能会遇到冲突,因为 <value> 元素的上下文不明确。

文档1(使用命名空间)

<book xmlns:bk="http://www.example.com/book">
    <bk:title>Introduction to XML</bk:title>
    <bk:value>123</bk:value>
</book>

文档2(使用命名空间)

<product xmlns:pr="http://www.example.com/product">
    <pr:name>XML Book</pr:name>
    <pr:value>$50</pr:value>
</product>

在这些文档中,bk:value 和 pr:value 具有不同的命名空间,因此它们是完全不同的元素,即使它们的本地名称相同。这样就避免了名称冲突,并且每个元素的含义都被明确标识。

2、了解了xml命名空间的作用,我们言归正传,继续学习如何使用Get data from XML步骤。xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header/>
<soapenv:Body>
<ns:loginResponse xmlns:ns="http://webservice.zhending.com">
<ns:return>{"result":"success","data":{"inputOrganCode":"aaa","inputOrganName":"bbbb","userIdcard":"cccc","userName":"ddd","token":"eeee"},"message":"操作成功"}</ns:return>
</ns:loginResponse>
</soapenv:Body>
</soapenv:Envelope>

3、拖动步骤【Get data from XML】、【写日志】两个步骤到画布中并连线,如下图所示:

 4、按照下图所示,点击按钮【浏览】选中文件demo.xml,然后点击按钮【增加】

 5、点击最下面的按钮【预览】,弹出提示要设置开始循环的xmlpath。

 6、切换到内容tab,点击按钮【获取XML文档的所有路径】,弹窗会列出xml文件中的所有path,我们根据自己的要求选择一个path,这里我们选择第一个根path。

 7、设置循环读取路径,切换到字段tab我们继续设置要提取的字段。这里直接点击按钮【获取字段】即可自动填充xml文件中的字段,可以根据填充的内容以及自己的实际应用场景进行微调。

 8、保存&运行,运行报错,如下图所示:

错误信息:

Exception occurred evaluting XPath: soapenv:Body/ns:loginResponse/ns:return. Exception: XPath expression uses unbound namespace prefix ns。

错误信息翻译:

异常发生在评估 XPath 时:soapenv:Body/ns:loginResponse/ns:return。异常:XPath 表达式使用了未绑定的命名空间前缀 ns。

9、kettle如果连命名空间都处理不了那就太弱了,继续寻找配置参数。切换到内容tab,将考虑命名空间勾选。保存&运行,转换正常运行。如下图所示:

注意:若xml文件内容或者xml文本没有使用命名空间的话就不用勾选此参数。

 10、上面的例子只是解决了从xml文件中读取,稍加改造支持从前置步骤读取xml文本内容。本次示例通过步骤【生成记录】生成xmlCont字段,当然也可以来源于http/https结果字段等,如下图所示:

11、根据下图所示,勾选参数XML源定义在一个字段里和选择XML源字段名,其他保持不变。保存&运行,转换可以正确运行。

 12、这里如果是xml文本,依然可以使用步骤自动生成xmlpath,切换到字段tab,点击按钮获取字段,将xml文本粘贴到文本框&然后点击确定即可自动填充xmlpath。如下图所示:

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值