您的位置:首页 > 游戏 > 游戏 > kettle从入门到精通 第八十四课 ETL之kettle kettle中Get data from XML使用实战教程

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

2024/11/16 12:55:55 来源:https://blog.csdn.net/zhangjin1222/article/details/140936346  浏览:    关键词: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。如下图所示:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com