1. 概述
1.1 版本
FineDataLink 版本 | 功能变动 |
---|---|
4.0.9 | 新增「XML解析」算子,可以将输入的 XML 数据解析为行列形式的数据 |
1.2 应用场景
对于 API、WebService、OData 接口中响应数据返回的 XML 格式数据、来自 XML 文件的数据,用户想要将其解析为行列格式数据,以供后续加工存储。
1.3 功能简介
FineDataLink 支持在「数据转换」中使用「XML解析」算子将 XML 格式数据解析为行列格式数据,以供后续加工存储。
2. 功能说明
「XML解析」算子配置界面如下图所示:
2.1 选择源字段
下拉列表内容为所有前置字段名。
上游节点为 API 输入且数据未展开为二维表时,源字段默认为 default。
解析后保留所有上游输出字段:勾选后,将所有上游输出字段与解析产生的新字段合并输出。
2.2 命名空间
若 XML 中带有命名空间,需要指定命名空间才能正确读取到节点。
勾选「指定命名空间」后,展示命名空间列表;允许新增和删除命名空间。
字段名 | 说明 |
---|---|
命名空间前缀 | 可编辑;不允许重名;对于实际 XML 中命名前缀相同的情况,请正确填写 URI ,并将前缀命名成不同的两个值,这样程序可正常解析 |
命名空间URL | 可编辑;允许重复 |
当 XML 中存在默认命名空间时,需要手动写一个自定义的命名空间前缀,填入「命名空间URL」后,才能正常解析。
示例:命名空间URL为http://111111,由于没有「命名空间前缀」,需要自定义一个「命名空间前缀」例如 xlms,然后「命名空间URL」填写http://111111,才能正常解析。
2.3 解析 XML 数据
2.3.1 选择 XML 节点
点击「选择XML节点」按钮后,弹出XML节点选择框。
XML 示例 | 多选树内容 |
---|---|
末端节点定义:没有子节点 所以黄色字段为末端节点,剩下的字段为非末端节点 非末端节点不允许被选中 勾选多个同名不同父的节点时,选择生成的输出字段名称后补1 比如选择上例中/bookstore/store/title和/bookstore/book/title,此时选择后输出字段的「解析后字段名称」为 title 和 title1,XPath 路径为各自有效路径 |
2.3.2 输出字段
列表项允许新增,允许删除。
经过 XML 解析产生的字段类型统一为字符串(从上游带来的字段类型不变)。
字段名 | 说明 |
---|---|
解析后字段名称 | 可编辑;配置解析后的字段名称 注1:字段名称不允许重名 注2:不允许引用参数 |
XPath 路径 | 可编辑;展示&配置解析后字段的 XPath 路径表达式 不允许引用参数 允许手写 XPath 路径 |
手写 XPath 支持的类型:「选取节点」类和「谓语」类
例如 XML 文档如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。 注:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径。 |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
谓语
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
3. 特殊场景处理策略
场景 | 处理策略 |
---|---|
源XML数据存在多个根元素,举例: | 点击「选择XML节点」时报错:XML数据根节点缺失 自行写XPath,预览及运行时报错:XML数据根节点缺失 |
配置的XPath不正确 | 解析出的字段内容为空 |
配置的XPath非法 或者 命名空间前缀中填写了非英文字母的字符 | 抛出解析异常 |
命名空间前缀重复 | 命名空间前缀不可重复 此例中,将两个 s 中的一个重命名为其他名称,并正常填写对应 URI ,通过树选的形式可正常解析 如果是手填路径,需要按照重命名后的命名空间前缀书写路径 |
源XML数据不完整,举例: | 点击选择XML节点时报错:XML数据格式不完整 自行写XPath,预览及运行时报错:XML数据格式不完整 |