jdk 中常用的 xml 数据解析

来源:互联网 发布:繁体字转换简体字 mac 编辑:程序博客网 时间:2024/05/17 05:00

xml(extensible markup language) 是一种可扩展标记语言,允许用户自定义复杂的数据结构,json(javascript object notation),可以认为是 JS 对象的文本表现形式,本质是字符串。xml、json 都是一种数据格式,最大的用途是用作数据的格式载体,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

xml

语法规范:详看

1.文档声明:<?xml version="1.0" encoding="UTF-8"?>2.标签元素需要闭合3.只能有一个根元素(根标签)4.XML 标签对大小写敏感......

常用解析方式:dom、sax、pull 解析

dom(Document Object Mode) 解析,在 js 编程中经常听说过。解析大概流程是这样的:先获取 xml 文件对应的 document 对象(树结构),然后调用其中的方法遍历数据 。其缺点是 dom 解析时会把整个 xml 映射成doc 树状对象,对于大的 xml 文件,会造成占用内存大,查找慢的问题。于是就出现了 sax 解析。

sax(Simple API for XML)解析,它逐行扫描文档,一边扫描一边解析,因此不需要将所有数据存储在内存中。因为逐行扫描,边扫描边解析,所有在解析过程中,我们要自定义处理实体,即实现 sax 提供的回调处理接口。其缺点是只能进行 xml 文件的读取,不能写,而且一开始解析就必须解析到结束,不能中途停止。

pull 解析,解决了 dom 和 sax 的遗留问题,和 sax 一样都是事件驱动的。

解析例子:

<?xml version="1.0" encoding="utf-8"?><books>    <book>        <name>java编程思想</name>        <author>Bruce Eckel</author>        <price>55</price>    </book>    <book>        <name>数据结构与算法设计</name>        <author>严蔚敏</author>        <price>35</price>    </book></books>

dom 解析

这里写图片描述

注意在 dom 结构中节点类型分三种,元素节点、属性节点、文本节点,可以通过 getNodeType() 方法判断,返回值 1、2、3 分别对应这三种类型。在上面给出的例子中,book 的子节点有 7 个,分别是 4 个文本节点,3 个元素节点。

sax 解析

这里写图片描述

这里写图片描述

因为 sax 是逐行解析的,事件驱动,所以我们要自行实现事件回调处理,其实就是继承或实现某些 handler , 关键是理清各个回调方法的调用顺序。我们可以通过查看文档方式找到相关的 handler。

这里写图片描述

两种种方式结果均一致

这里写图片描述

pull 方式,需要依赖 kxml、 xmlpull 两个 jar 包,在Android中极力推荐的xmlpull方式解析xml,其实用流程与 sax 方式相似。

小结:这几种方式大致流程都是相似的,先获取工厂,通过工厂(工厂设计模式)获取响应的解析器(或者获取 builder,再 build 出相应的解析器 ),得到解析器后就解析,并调用相关方法遍历数据。

JAXB 可以认为是一个 xml 与 java 类间的 orm 映射框架,有点像 hibernate 是一个数据库与 java 类间的 orm 映射框架。通过 JAXB 可以,直接把 xml 转换为对应的 java 对象。

这里写图片描述

使用 JAXB ,主要是从 JAXBContext 上下文对象获取 Marshaller 和 Unmarshaller 对象,Marshaller 是用来把对象解析到 xml 中的,Unmarshaller 是从 xml 中解析出对象。

这里写图片描述

注意,这里的 java 对象,是一个 Java bean,其中成员变量名称要和对应的标签名一致(估计这里是使用反射实现的,因此名称要一致)。对应 xml 根元素的类,需要上注解。

结果

这里写图片描述

这里写图片描述

json 的解析下一节待续…