一、概述:
用xml保存数据,一般只适用于单机且数据量不大,安全级别低的情况。常用的xml解析技术,有DOM和SAX。
DOM技术 | SAX技术 |
基于xml文档树结构的解析; 适用于多次访问的xml文档。 比较消耗资源。 | 基于事件的解析; 适用于大数据量的xml文档。 占用资源少,内存消耗小。 |
二、DOM(Document Object Model)解析技术
1、DOM概述
DOM树:
DOM解析:如下图找寻这些节点,然后对这些节点进行相关操作,用这样的思路操作xml文件,我们就称之为DOM解析。
在DOM接口规范中,有四个基本的接口:Document , Node ,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,像Document,Element, Attribute, Text, Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。
2、Document
Document接口代表了整个xml/html文档,因此,它是整棵文档数的根,提供了对文档中的数据进行访问和操作的入口。
常用方法 | 说明 |
getElementsByTagName(String tagName) | 按文档顺序返回文档中指定标记名称的所有元素集合 |
createElement(String tagName) | 创建指定标记名称的元素 |
3、Node
常用方法 | 说明 |
NodeList getChildNodes() | 获取该元素的所有子节点,返回为节点集合。 |
4、Element
常用方法 | 说明 |
String getTagName() | 元素名称 |
5、Node与Element的区别:
Node表示文档树中的任意一种类型节点,可以是元素节点、属性节点或文本节点等多种节点;而Element则只表示Node节点中的元素节点,即Node是Element的父接口。
6、读取xml文件
使用DOM解析xml文档的步骤主要有:
(1)创建解析器工厂对象;
(2)由解析器工厂对象创建解析器对象;
(3)由解析器对象对指定xml文件进行解析,构建相应DOM树,创建Document对象;
(4)以Document对象为起点对DOM树的节点进行增删改查操作;
7、程序解释:
(1)创建解析器工厂对象DocumentBuilderFactory;通过下列代码获得:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();我们创建解析器工厂对象是为了获得解析器对象。当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。这个用了工厂模式。
(2)由解析器工厂对象创建解析器对象DocumentBuilder;通过下列代码获得:
DocumentBuilder db=dbf.newDocumentBuilder();通过工厂对象的newDocumentBuilder()方法来获得DocumentBuilder对象,这个对象代表了具体的DOM解析器。
(3)由解析器对象对指定xml文件进行解析,构建相应DOM树,创建Document对象。通过下列代码获得:Document doc=db.parse(“C:/xml/message.xml”);
DocumentBuilder的parse()方法接受一个xml文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个xml文档的树模型。以后所有的对xml文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了。
(4)从上面得到的Document对象开始,我们就可以进行DOM解析了。使用Document对象的getElementsByTagName()方法,得到一个NodeList对象,一个Node对象代表了一个xml文档中的一个标签元素(元素节点),然后我们可以通过NodeList对象的item()方法来得到列表中的每一个Node对象。
v 怎么获得该元素节点的文本内容:
然后通过Node的getFirstChild().getNodeValue()来得到该元素节点的文本内容。
这个getFirstChild()方法必须加上,因为它主要和W3C对DOM的定义有关。
还有就是Brand节点下可能有子元素节点,或者其属性,那么又应该怎么获取其内容呢?
v 怎么获取Brand节点(元素节点)的属性内容:
v 怎么获取Brand节点(元素节点)的子节点(元素节点)集合: