场景:解析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。如下图所示: