花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述kettle庖丁解牛第13篇之XML文件输入相关的知识,希望能为你提供帮助。
引言上一篇文章中,我们介绍了:CSV文件输入组件的各种详细设置,实战演示了如何操作它来读取磁盘上的CSV文件。最后还扩展了,使用文本文件输入组件读取读取磁盘上的CSV文件。
在本篇文章中,我们接着介绍:kettle中的XML文件输入组件(Get data from XML)。
要想学明白XML文件输入组件,我们就要扩展着聊聊XML和XPath那些事了。
XML那些事a、概述
Xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。Xml是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
总结成一句话:xml本身是一种格式规范,是一种包含了数据以及数据说明的文本格式规范。
b、举例说明
我要给对方传输一段数据,内容是"大飞哥,数据架构师,88年"。将这段话按照属性拆分为三个数据的话,昵称:大飞哥,职务:数据架构师,出生年代:88年。
程序不像人,它不可能体会字面意思,并自动拆分出数据。需要人为帮助程序做拆分,因此出现了各种各样的数据格式以及拆分方式。
(1)、情况1
数据为"大飞哥,数据架构师,88年"
按照“,”拆分,第一部分为昵称,第二部分为职务,第三部分为出生年代。
(2)、情况2
数据为"大飞哥*数据架构师*88年"
按照“*”拆分,第一部分为昵称,第二部分为职务,第三部分为出生年代。
c、总结
这两种方式都可以用来容纳数据并能够被解析,但是不直观,通用性也不好,而且如果出现超过限定字数的字符串就容纳不了,也可能出现数据本身包含特殊字符,还需要做转义。
基于这种情况,出现了xml这种数据格式, 上面的数据用XML表示的话,就会清晰很多。
(1)、xml写法1
<
person nickname="大飞哥" title="数据架构师" birth="88年">
<
/person >
(2)、xml写法2
<
person>
<
nickname value="https://www.songbingjia.com/android/大飞哥">
<
/nickname>
<
title value="https://www.songbingjia.com/android/数据架构师">
<
/title>
<
birth value="https://www.songbingjia.com/android/88年">
<
/birth>
<
/person>
?
(3)、存储结构
树形结构
d、xml声明
xml声明一般是xml文档的第一行,xml声明由以下2个部分组成:version和encoding
例子:<
?xml version="1.0" encoding="UTF-8"?>
e、根元素
整个XML文件中,有且只有一个根元素。它是XML文件中,第一个最开始\\最后结束的标签对。下面的数据中,person就是根元素。
<
person>
-----------最开始
<
nickname value="https://www.songbingjia.com/android/大飞哥">
<
/nickname>
<
title value="https://www.songbingjia.com/android/数据架构师">
<
/title>
<
birth value="https://www.songbingjia.com/android/88年">
<
/birth>
<
/person>
---------最后结束
f、元素
语法:<
元素标签>
内容<
/元素标签>
(1)所有的xml元素都必须有结束标签;
<
title>
数据架构师<
/title>
(2)xml标签对大小写敏感;
正确:<
title>
数据架构师<
/title>
错误:<
Title>
数据架构师<
/title>
(3)xml必须正确地嵌套;
正确:<
title>
<
birth>
数据架构师<
/birth>
<
/title>
错误:<
title>
<
birth>
数据架构师<
/title>
<
/birth>
(4)元素的命名规则:
名称中可以包含字母、数字或者其他的字符;
名称不能以数字或者标点符号开始;
名称中不能包含空格。
(5)空元素
<
nickname>
<
/nickname>
<
title>
<
/title>
<
birth>
<
/birth>
g、属性
(1)、语法
<
元素名 属性名="属性值"/>
举例如下:
<
person>
<
nickname value="https://www.songbingjia.com/android/大飞哥"/>
<
title value="https://www.songbingjia.com/android/数据架构师"/>
<
birth value="https://www.songbingjia.com/android/88年"/>
<
/person>
(2)、注意
属性值用双引号包裹;一个元素可以有多个属性,它的基本格式为:
<
元素名 属性名="属性值" 属性名="属性值">
属性值中不能够直接包含<
.",&
。
xml的解析常的XML解析技术有3种:SAX解析XML、DOM解析XML、Pull解析XML
技术的对比
内存占用:SAX、Pull比DOM要好;
编程方式:SAX采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类XML,就要编写一个新的适合该类XML的处理类。DOM是W3C的规范,Pull简洁。
访问与修改:SAX采用流式解析,DOM随机访问。
访问方式:SAX,Pull解析的方式是同步的,DOM逐字逐句
XPath表达式XPath(全称:XML Path Language)即XML路径语言,它是一门在XML文档中查找信息的语言,最初被用来搜寻XML文档,同时它也适用于搜索html文档。
a、多种类型的节点
XPath提供了多种类型的节点,常用的节点有:元素、属性、文本、注释以及文档节点。如下所示:
<
?xml version="1.0" encoding="utf-8"?>
<
website>
<
site>
<
title lang="zh-CN">
website name<
/title>
<
name>
编程帮<
/name>
<
year>
2010<
/year>
<
address>
www.biancheng.net<
/address>
<
/site>
<
/website>
上面的XML文档中的节点例子:
<
website>
<
/website>
(文档节点)
<
name>
<
/name>
(元素节点)
lang="zh-CN" (属性节点)
b、节点关系
XML文档的节点关系和HTML文档相似,同样有父、子、同代、先辈、后代节点。如下所示:
<
?xml version="1.0" encoding="utf-8"?>
<
website>
<
site>
<
title lang="zh-CN">
website name<
/title>
<
name>
编程帮<
/name>
<
year>
2010<
/year>
<
address>
www.biancheng.net<
/address>
<
/site>
<
/website>
上述示例分析后,会得到如下结果:
title name year address 都是 site 的子节点
site 是 title name year address
父节点
title name year address
属于同代节点
title 元素的先辈节点是 site website
website 的后代节点是 site title name year address
c、基本语法使用
Xpath 使用路径表达式在文档中选取节点,下表列出了常用的表达式规则
表达式
| 描述
|
node_name
| 选取此节点的所有子节点。
|
/
| 绝对路径匹配,从根节点选取。
|
//
| 相对路径匹配,从所有节点中查找当前选择的节点,包括子节点和后代节点,其第一个 / 表示根节点。
|
.
| 选取当前节点。
|
..
| 选取当前节点的父节点。
|
@
| 选取属性值,通过属性值选取数据。常用元素属性有 @id 、@name、@type、@class、@tittle、@href。:
|
d、xpath通配符
Xpath 表达式的通配符可以用来选取未知的节点元素,基本语法如下
通配符
| 描述说明
|
*
| 匹配任意元素节点
|
@*
| 匹配任意属性节点
|
node()
| 匹配任意类型的节点
|
e、Xpath内建函数
Xpath 提供 100 多个内建函数,这些函数给我们提供了很多便利,比如实现文本匹配、模糊匹配、以及位置匹配等,下面介绍几个常用的内建函数。
函数名称
| xpath表达式示例
| 示例说明
|
text()
| ./text()
| 文本匹配,表示值取当前节点中的文本内容。
|
contains()
| //div[contains(@id,stu)]
| 模糊匹配,表示选择 id 中包含“stu”的所有 div节点。
|
last()
| //*[@class=web][last()]
| 位置匹配,表示选择@class=web的最后一个节点。
|
position()
| //*[@class=site][position()<
=2]
| 位置匹配,表示选择@class=site的前两个节点。
|
start-with()
| "//input[start-with(@id,st)]"
| 匹配 id 以 st 开头的元素。
|
ends-with()
| "//input[ends-with(@id,st)]"
| 匹配 id 以 st 结尾的元素。
|
concat(string1,string2)
| concat(C语言中文网,.//*[@class=stie]/@href)
| C语言中文与标签类别属性为"stie"的 href 地址做拼接。
|
转换转换(transaformation)是ETL解决方案中最主要的部分,它处理抽取、转换、加载各种对数据行的操作。
创建转换
我们要做的ETL操作,全是在转换中设计的,所以我们要先创建一个转换。
保存转换
给你新建的转换,起个名字,并保存
XML文件输入此组件可以实现,从指定的XML文件输入数据。
a、文件指定
1、文件标签指定数据源文件,点击“浏览”按钮,浏览本地的xml文件。点击"增加"按钮,你可以添加一个文件到"选择文件"中,如下所示:
这一部分的选项配置和文本文件输入组件差不多,不再详细解释。
b、内容
选项说明
选项
| 描述
|
循环读取路径
| 指的是xml文件中的层次结构
|
编码
| 指的是xml文件的字符编码类型
|
考虑命名空间
| 选中此项即可识别XML文档名称空间
|
忽略注释
| 解析时忽略XML文档中的所有注释
|
验证XML
| 在解析之前验证XML
|
忽略空文件
| 文件为空不读取数据
|
如果没有文件不要报告错误
| 如果没有找到文件,请不要报错。
|
限制
| 限制输出行数
|
用于截取数据的XML路径(大文件)
| 和循环读取路径
基本一样,与处理大数据相关
|
输出中包括文件名
| 读入的每一行数据,都多了一个字段列,xml的绝对路径
|
输出中包括行号
| 显示行数,为递增列
|
将文件增加到结果文件中
| 在一个转换中引用后,会把文件的名字保存到内存中,然后下一个job或者转换去引用
|
c、字段
选项说明
选项
| 描述。
|
名称
| 设置要在输出流中显示的字段名称。
|
XML路径
| 要读取的元素节点或属性的路径
|
节点
| 要读取的元素类型:节点或属性
|
结果类型
| 字段类型(String、Date、Number 等)。
|
格式
| 控制输入数据的格式(整数、有小数位、日期格式等)
|
长度
| 对于Number:有效数的数量。
对于String:字符的长度。
对于Date:打印输出字符的长度(例如4 代表返回年份)。
|
精度
| 对于Number:浮点数的数量。
对于String,Date,Boolean:未使用。
|
货币符号
| 用来解释如$10,000.00 的数字。
|
小数点符号
| 小数点可以是”.”(10;
000.00)或者”,”(5.000,00)。
|
组
| 分组可以是”.”(10;
000.00)或者”,”(5.000,00)。
|
去空字符串
| 处理之前先去空。
|
重复
| Y/N:如果在当前行中对应的值为空,则重复最后一次不为空的值。
|
d、其他输出字段
选项说明
【kettle庖丁解牛第13篇之XML文件输入】选项
|
推荐阅读
|