《Flink读取HDFS中的xml》系列记录了我在(使用Flink)处理xml文件过程中遇到的问题,以及对解决办法的探索。
本系列包含以下几个部分
- 一、读取XML的几种方式
xml解析的几种方式,适用场景。 - 二、Flink XmlInputFormat读取xml
Flink读取HDFS中的xml文件。 - 三、读取HDFS中的xml zip压缩文件
多个xml文件压缩后存储到HDFS,如何使用Flink读取。 - 四、ZipXmlInputFormat的优化
优化对zip xml文件的读取。
- 什么是xml
xml是一种标记语言,它使用标签存储数据,使用标签的属性对数据进行描述,使用标签之间的嵌套关系标识数据的分类(层级)关系。由于存储数据的同时也存储了大量关于数据的描述信息,其中通常有大量重复内容。这种标签嵌套标签的结构可以看成一种树形结构。
xml文档示例
<root>
<users>
<user id="a">
<name>王二</name>
<age>8</age>
</user>
<user id="b">
<name>张三</name>
<age>10</age>
</user>
</users>
</root>
- 使用DOM和SAX方式解析xml
DOM和SAX解析方式都是Java官方支持的解析方式,不同之处在于:
DOM将整个xml文档加载到内存中,建立一个与之对应的
树
型数据结构,方便随机读取和修改,但是当文档较大时占用内存交大。SAX将xml作为文本顺序读取,在标签开始和结束时通过回调方法触发解析程序和解析终止程序,由于不需要将整个文本加载到内存,可以做到边读取边解析,适合于大文件的读取,也可以有选择的读取指定标签。
DOM方式主要方法的调用可以参看文末的参考链接,这里主要记录SAX方式的读取流程:
SAX方式解析XML的精髓在于org.xml.sax.helpers.DefaultHandler
中的几个方法重写:
- startDocument:读取到文档开始,可以做一些初始化工作
- startElement:读取每个标签的开始,可以获取标签的属性,过滤标签
- characters:读取标签开始和结束之间的内容(text的内容)
- endElement:读取到每个标签的结束,可以根据标签名称,对text进行解析、记录
- endDocument:读取到文档末尾,可以做一些清理工作
上述的5个方法的顺序,也是整个文档解析的顺序,重复2到3步完成整个文档解析。
参考链接:
Java文件操作①——XML文件的读取