dom解析和sax解析

解析xml有四种方法:DOM,SAX,DOM4j,JDOM.

我们主要学了两种:DOM和SAX.

DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。

DOM和SAX的不同:

1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。

2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。

3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不行。SAX是从文档开始执行遍历的。并且只能遍历一次。也就是说我们不能随机的访问XML文件,只能从头到尾的将XML文件遍历一次(当然也可以中间截断遍历)。

DOM和SAX对XML文件的解析:

1.  在使用DOM解析XML时,我们首先需要通过DocumentBuilderFactory这个类得到一个工厂的API,使应用程序能够从XML文档获取 生成对象树的解析器。通过此类的 newinstance() 方法我们可以获得此类的一个新实例。然后通过创建DocumentBuilder的实例使其从XML文档中获取DOM文档实例。
DocumentBuilder的实例我们可以通过DocumentBuilderFactory类的newDocumentBuilder()方法得 到。之后就通过DocumentBuilder类的parse(InputStream is)方法将给定文件的内容解析为一个XML文档,并且返回一个新的DOM Document 对象。具体步骤如下:

File file = new File("D:\\编码\\xml\\domxml.xml");

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

try {

DocumentBuilder db = dbf.newDocumentBuilder();

Document dt = db.parse(file);

} catch (Exception e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

这 时我们就可以开始解析文档了。通过NodeList,Node分别可以得到节点列表和节点了。NodeList可以由Document对象的 getElementsByTagName("元素名称");来得到你想得到的哪个元素的节点列表。由NodeList的item(整形参数)方法来得到 节点。通过Node的getFirstChild().getNodeValue()方法可以得到文本节点值。方法如下:

NodeList nl = dt.getElementsByTagName("star");//star为一个元素名称

Node nd = nl.item(0);//得到节点列表 nl 的第一个节点。

此外我们可以通过循环来取得节点列表中所有的节点。

当一个元素有子元素时我们可以通过父节点列表取得子节点列表。方法如下:

NodeList nlF = dt.getElementsByTagName("star"); //star为一个元素名称

Node ndF = nl.item(0); //得到节点列表 nl 的第一个节点。

for(int i = 0; i < nlF.getLength(); i ++)

{

Node ndF = nlF.item(i); //取得元素的所有节点

NodeList nlC = ndF.getChildNodes(); //取得子元素的节点列表

for(int j = 0; j < nlC.getLength(); j ++)

{

Node ndC = nlC.item(j);

if(ndC.getNodeType()==ndC.ELEMENT_NODE){

String str = ndC.getFirstChild().getNodeValue(); //取得文本节点

System.out.println(str); //打印出文本节点

}

}

}

}

/** 注意*/ 由于通过父节点列表得到子节点列表而得到的子元素节点包含了空格所占有的节点,所以这里需要用if(ndC.getNodeType()== ndC.ELEMENT_NODE)来做判断是否取得的是元素节点(ndC.getNodeType()为节点类型,ndC.ELEMENT_NODE节 点类型为元素节点(注:文本节点是元素节点的一个子节点))。

2. 最常用的SAX解析器是JAXP。JAXP是作为javax.xml包提供的,包括SAX和DIM的Java接口以及Java XML解析器必须是实现的基本接口和类。通过继承DefaultHandle类实现此类方法则可以遍历XML文档:

void startDocument()

//接收文档开始的通知

void endDocument()

//接收文档结束的通知

void startElement(String uri,String localName,String qName, Attributes attributes)

//接收元素开始的通知

void endElement(String uri,String localName, String qName)

//接收元素结束的通知

void characters(char[] ch,int start, int length)

//接收字符数据的通知

获取SAX解析器的方法和DOM相似。获取SAX解析器的方法如下:

SAXParserFactory spf = SAXParserFactory.newInstance(); //得到工厂的一个新实例

try {

SAXParser sp = spf.newSAXParser(); //得到SAXParser类的实例

File file = new File("E:\\yuxin_document\\xml\\mytest.xml"); //XML文件

SaxHandle handle = new SaxHandle(); //SaxHandle 这是一个继承了DefaultHandle的实现了XML遍历                                                             的一个自定义的类

sp.parse(file, handle); //解析一个XML文档

} catch (ParserConfigurationException e) {

// TODO 自动生成 catch 块

e.printStackTrace();

} catch (SAXException e) {

// TODO 自动生成 catch 块

e.printStackTrace();

} catch (IOException e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

** 为了能够清晰的显示出XML中的内容,我们还需要将解析后取得的内容显示在GUI上。一般用表格来实现。

SAX和DOM的合用

我们可以用SAX来解析XML再用DOM来将解析后的数据写成一个XML文件.

使用DOM创建一个XML文件的方法如下:

首先,需要得到一个写入XML文件的Document对象:

Document doc = DocumentHelper.createDocument();

然后就可以在这个文档中添加内容了,如:

Element root = doc.addElement("root");  //写入一个根元素"root"

Element el = root.addElement("子元素"); //在根元素中写入一个子元素

当将所有信息写入文档后则可以将Document写入XML文件中了,方法如下:

FileWriter file = new FileWriter("D:\\doc.xml"); //得到一个文件输出流对象

document.write(file); //将文档内容写入文件中(document是上面所得到的Document

对象)

这是一种简单的写入方式

如果你想格式化XML文件则可以这样做:

FileOutputStream fos = new FileOutputStream("D:\\doc.xml"); //

得到一个文件输出流对象

OutputFormat format = OutputFormat.createPrettyPrint();  //得到OutputFormat

格式化类的对象

XMLWriter xw = new XMLWriter(fos,format);  //得到XML输出流XMLWriter接口的一

个实例

xw.write(doc);  //将文档写入XML

fos.close();  //关闭输出流

xw.close();

时间: 2024-10-17 01:39:15

dom解析和sax解析的相关文章

XML 解析---dom解析和sax解析

目前XML解析的方法主要用两种: 1.dom解析:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML文档加载到内存中,生成该XML文档对应的document对象,然后把XML文档中的各个标签元素变成相应的Element对象,文本会变成Text对象,属性会变成Attribute对象,并按这些标签.文本.属性在XML文档中的关系保存这些对象的关系. 缺点:消耗内存,所以使用dom解析XML文档时不能解

DOM解析和SAX解析的对比

SAX & DOM 解析对比 SAX 解析特点 只读 从上向下 速度快 解析的时候相对比较繁琐,有5个代理方法,每个代理方法都要写一定代码 适合大的 XML 文件解析 在计算机领域,针对 XML 解析,还有 DOM 解析方式,在 PC 端和服务器端被广泛使用 背景 主要用在 PC 端或者服务器端 苹果提供了 NSXML 类支持 DOM 方式的解析 不过 NSXML 类只能用在 MAC 开发,在 iOS 中无法直接使用 DOM 特点 DOM 方式不仅能解析 XML 文档,还能够修改: 增加节点/删

dom解析和sax解析的区别

dom 和 sax 解析方法的区别 1,dom解析的优点是对文档crud比较方便,缺点是占用内存较多2,sax解析的优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的crud 解析方式1 dom是将整个文档加载进内存,所以内存消耗会很大,当文档的太大时,不适合用Dom  dom文档加载进内存后作为一个Document对象,把每个节点当作一个Element对象,如果该元素有内容,就将该内容作为一个Text对象,所以dom对文档的crud很方便2 sax是一行一行的解析,并且不能

JavaWeb-05 XML基础(Dom解析和Sax解析)

JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据. XML标签没有被预定义,需要用户自行定义标签. XML技术是W3C组织(WorldWideWeConsortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范. 作用: a. 传输数据 b. 配置文件(主要用途) XML技术用于解决什么问题? a. XML语言出现

java解析XML① 之DOM解析和SAX解析(包含CDATA的问题)

Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都会调用相应方法,我们可以在这些

非常简单的XML解析(SAX解析、pull解析)

这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 1 package com.example.demo.service; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.xml.parsers.DocumentBuilder; 7 import javax.xml.parsers.DocumentBuilderFactory; 8 import javax.xml.parse

XML解析(二) SAX解析

XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得. 注意SAXParser的parse()方法: parse(String uri, DefaultHandler dh),parse(File f, DefaultHandler dh)等都需要传递一个DefaultHandler的对象. 查看API帮助手册可知,SAX解析是事件驱动的,De

XML文件解析DOM解析和SAX解析

解析一个XML文档有哪些内容解析有:dom和sax两种dom:把整个XML文档放入内存,适合XML随机访问,占用内存资源大sax:事件驱动型的XML解析方式,顺序读取,不用一次装载整个文件,遇到标签会触发一个事件,适合对XML的顺序访问,占用内存资源稍小 Node: XML 文档的 documentElement 属性是根节点. nodeName 属性是节点的名称.nodeName 是只读的 元素节点的 nodeName 与标签名相同 属性节点的 nodeName 是属性的名称 文本节点的 no

Java学习总结(21)——XML文档解析:DOM解析,SAX解析

一.XML简介1.可扩展性标记语言(eXtensible Markup Language)2.XML用于描述数据3.应用场合:(1)持久化存储数据(2)数据交换(3)数据配置4.XML语法(1)文档类型:在编写XML文档时,需要先使用文档声明,声明XML文档的类型.最简单的声明语法:<?Xml version="1.0" ?>用encoding属性说明文档的字符编码:<?Xml version="1.0" encoding="GB2312