1

kettle庖丁解牛第13篇之XML文件输入

 1 year ago
source link: https://blog.51cto.com/51power/5245364
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上一篇文章中,我们介绍了:CSV文件输入组件的各种详细设置,实战演示了如何操作它来读取磁盘上的CSV文件。最后还扩展了,使用文本文件输入组件读取读取磁盘上的CSV文件。

在本篇文章中,我们接着介绍:kettle中的XML文件输入组件(Get data from XML)。

要想学明白XML文件输入组件,我们就要扩展着聊聊XML和XPath那些事了。

XML那些事

Xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。Xml是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

总结成一句话:xml本身是一种格式规范,是一种包含了数据以及数据说明的文本格式规范。

b、举例说明

我要给对方传输一段数据,内容是"大飞哥,数据架构师,88年"。将这段话按照属性拆分为三个数据的话,昵称:大飞哥,职务:数据架构师,出生年代:88年。

程序不像人,它不可能体会字面意思,并自动拆分出数据。需要人为帮助程序做拆分,因此出现了各种各样的数据格式以及拆分方式。

(1)、情况1

数据为"大飞哥,数据架构师,88年"

按照“,”拆分,第一部分为昵称,第二部分为职务,第三部分为出生年代。

(2)、情况2

数据为"大飞哥*数据架构师*88年"

按照“*”拆分,第一部分为昵称,第二部分为职务,第三部分为出生年代。

这两种方式都可以用来容纳数据并能够被解析,但是不直观,通用性也不好,而且如果出现超过限定字数的字符串就容纳不了,也可能出现数据本身包含特殊字符,还需要做转义。

基于这种情况,出现了xml这种数据格式, 上面的数据用XML表示的话,就会清晰很多。

(1)、xml写法1

<person nickname="大飞哥" title="数据架构师" birth="88年"></person >

(2)、xml写法2

<person>

  <nickname value="大飞哥"></nickname>

  <title value="数据架构师"></title>

  <birth value="88年"></birth>

</person>​

(3)、存储结构

kettle庖丁解牛第13篇之XML文件输入_xml

d、xml声明

xml声明一般是xml文档的第一行,xml声明由以下2个部分组成:version和encoding

例子:<?xml version="1.0" encoding="UTF-8"?>

e、根元素

整个XML文件中,有且只有一个根元素。它是XML文件中,第一个最开始\最后结束的标签对。下面的数据中,person就是根元素。

<person>       -----------最开始

  <nickname value="大飞哥"></nickname>

  <title value="数据架构师"></title>

  <birth value="88年"></birth>

</person>        ---------最后结束

语法:<元素标签>内容</元素标签>

(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>

(1)、语法

<元素名 属性名="属性值"/>

举例如下:

<person>

 <nickname value="大飞哥"/>

 <title value="数据架构师"/>

 <birth value="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操作,全是在转换中设计的,所以我们要先创建一个转换。

kettle庖丁解牛第13篇之XML文件输入_xpath_02

kettle庖丁解牛第13篇之XML文件输入_xml_03

kettle庖丁解牛第13篇之XML文件输入_xml_04

给你新建的转换,起个名字,并保存

kettle庖丁解牛第13篇之XML文件输入_kettle_05

kettle庖丁解牛第13篇之XML文件输入_xml文件输入_06

XML文件输入

此组件可以实现,从指定的XML文件输入数据。

kettle庖丁解牛第13篇之XML文件输入_xml文件输入_07

kettle庖丁解牛第13篇之XML文件输入_kettle_08

a、文件指定

1、文件标签指定数据源文件,点击“浏览”按钮,浏览本地的xml文件。点击"增加"按钮,你可以添加一个文件到"选择文件"中,如下所示:

kettle庖丁解牛第13篇之XML文件输入_Get data from XML_09

kettle庖丁解牛第13篇之XML文件输入_xml_10

kettle庖丁解牛第13篇之XML文件输入_xml文件输入_11

kettle庖丁解牛第13篇之XML文件输入_xpath_12

这一部分的选项配置和文本文件输入组件差不多,不再详细解释。

kettle庖丁解牛第13篇之XML文件输入_Get data from XML_13

选项说明

循环读取路径

指的是xml文件中的层次结构

指的是xml文件的字符编码类型

考虑命名空间

选中此项即可识别XML文档名称空间

解析时忽略XML文档中的所有注释

验证XML

在解析之前验证XML

忽略空文件

文件为空不读取数据

如果没有文件不要报告错误

如果没有找到文件,请不要报错。

限制输出行数

用于截取数据的XML路径(大文件)

和循环读取路径 基本一样,与处理大数据相关

输出中包括文件名

读入的每一行数据,都多了一个字段列,xml的绝对路径

输出中包括行号

显示行数,为递增列

将文件增加到结果文件中

在一个转换中引用后,会把文件的名字保存到内存中,然后下一个job或者转换去引用

kettle庖丁解牛第13篇之XML文件输入_xpath_14

选项说明

设置要在输出流中显示的字段名称。

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文件输入_xml_15

选项说明

文件名字段

包括文件名称以及扩展名,以及文件路径的整体

扩展名字段

仅仅包括文件名称以及扩展名称

仅仅包括文件的路径

文件大小字段

是否为隐藏文件字段

最后修改时间字段

最后一次此文件的修改时间

Uri字段

文件/目录的绝对路径

Root uri字段

好了,关于XML文件输入组件的每一个标签页,我都尽可能的讲解了一下。其实我日常工作中,并没有使用到这么多,常用的也就是那么几个。但是我们学习过程中,我还是讲得全一些吧,希望大家花一次时间学习,尽可能都有个大概的了解吧。下面我们实例操作一下吧,这样大更好的吸收和理解。

a、创建xml文件

我在D盘下,创建一个xml文件,命名为bigdata。详细内容如下

kettle庖丁解牛第13篇之XML文件输入_xml_16

b、创建转换

kettle庖丁解牛第13篇之XML文件输入_xpath_17

c、XML文件输入设置

增加本地xml文件,做为数据源

kettle庖丁解牛第13篇之XML文件输入_Get data from XML_09

kettle庖丁解牛第13篇之XML文件输入_xml_10

kettle庖丁解牛第13篇之XML文件输入_xml文件输入_11

kettle庖丁解牛第13篇之XML文件输入_xpath_12

设置内容和编码

kettle庖丁解牛第13篇之XML文件输入_xpath_22

设置字段(此处可参考XPth表达式)

kettle庖丁解牛第13篇之XML文件输入_xml_23

d、预览记录

kettle庖丁解牛第13篇之XML文件输入_xml文件输入_24

kettle庖丁解牛第13篇之XML文件输入_Get data from XML_25

kettle庖丁解牛第13篇之XML文件输入_xml_26

兄弟们,看到这个预览数据的界面,证明你已经成功的通过XML文件输入组件,把你磁盘上的一个xml文件,读取进来了。恭喜恭喜,你已经会使用XML文件输入组件了。

本篇文章主要讲解了:XML和XPath的那些事,然后又讲解了XML文件输入组件的各种详细设置,最后实战演示了如何操作它来读取磁盘上的xml文件。

兄弟们,其实想和作是有一段距离的,你想着想着就没有了,可是你做着做着,它就落地了。

啥都别说了,兄弟们后面跟着我干就完了,我们依然掰开揉碎的方式去说。后续的内容更精彩,敬请期待,感谢兄弟们的关注!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK