DOM 解析和SAX解析 XML 文档

一、xml的解析方式Dom和SAX区别:

DOM:当按 照DOM模型解析XML文档时,就会在内存中构造一个对应的DOM树,它可以用于不同节点之间的遍历。然而,在遍历之前必须先完成DOM树的构造。因此, 在处理规模较大的XML文档时就很耗内存,占用资源较多。尤是只需要操作文档中一小部分时效率很低。DOM的优点在于它在内存中保存文档的整个模型。DOM的基本对象有5个:DocumentNodeNodeListElementAttr

SAX:SAX是一个事实上的标准。与DOM不同的是,它是用事件驱动模型。解析XMl文档时每遇到一个开始或者结束标 签、或者属性、或者一条指令时,程序就产生一个事件来进行相应的处理。所以在操作文档之前不需要对整个文档进行解析。实际上,文档的各个部分可以在进行解 析的同时进行操作。因此,SAX相对于DOM来说更适合操作大文档。SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读XML数据的方式。

二、SAX解析 XML 文档

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。

SAX方式解析XML文档:

案例:xml文件内容如下sax.xml

<!DOCTYPE 四大名著 [
<!ELEMENT 四大名著 (西游记,红楼梦)>
<!ATTLIST 西游记 id  ID #REQUIRED>
]>
<四大名著>
<西游记  id="x001"><作者>吴承恩</作者></西游记>
<红楼梦  id="x002"><作者>曹雪芹</作者></红楼梦>
</四大名著>

用sax解析xml文档

package sax;

import java.io.InputStream;

import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class SaxTest {
@Test
public void test() throws Exception{
	//sax解析器的工厂对象,使用SAXParserFactory创建SAX解析工厂
	SAXParserFactory factory=SAXParserFactory.newInstance();
	//工厂对象 创建解析器对象
	SAXParser saxParser=factory.newSAXParser();
	//工厂模式 装饰模式 单例模式
	//通过解析器对象得到一个XML的读取器
	XMLReader reader=saxParser.getXMLReader();
	InputStream is=this.getClass().getClassLoader().getResourceAsStream("sax//sax.xml");
	
	//设置读取器的事件处理器
	reader.setContentHandler(new MyContenHandler());
	//解析xml文件
	reader.parse(new InputSource(is));
}
class  MyContenHandler  implements ContentHandler{
     boolean isOK=false;
	@Override
	public void setDocumentLocator(Locator locator) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void startDocument() throws SAXException {
	System.out.println("文档开始解析了");
		
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("文档解析完毕了");
		
	}

	@Override
	public void startPrefixMapping(String prefix, String uri)
			throws SAXException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void endPrefixMapping(String prefix) throws SAXException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		if ("作者".equals(qName)) {
			isOK=true;
			System.out.println("作者开始");
		}
		
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if ("作者".equals(qName)) {
			System.out.println("作者完毕");
			isOK=false;
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (isOK) {
			System.out.println(new String(ch,start,length));
		}
		
	}

	@Override
	public void ignorableWhitespace(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void processingInstruction(String target, String data)
			throws SAXException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void skippedEntity(String name) throws SAXException {
		// TODO Auto-generated method stub
		
	}
	
}
}

三、 DefaultHandler方法

startElement(String uri, String localName, String qName, Attributes attributes)接收元素开始的通知。

uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象

案例 xml文件web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns:csdn="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <csdn:display-name></csdn:display-name>	
  <csdn:welcome-file-list>
    <csdn:welcome-file>index.jsp</csdn:welcome-file>
  </csdn:welcome-file-list>
</web-app>
<!-- 
uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 

 -->

分别查询 String   uri, String localName, String qName,   Attributes attributes

package sax.startelement;

import static org.junit.Assert.*;

import java.io.File;
import java.io.FileReader;



import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class Demo2 {

	@Test
	public void test() throws Exception {
		XMLReader reader=XMLReaderFactory.createXMLReader();
	    //设置解析的操作
		reader.setContentHandler(new MyDefault());
		reader.parse(new InputSource(new FileReader(new File("src//web.xml"))));
	}
	class MyDefault extends DefaultHandler{

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			super.startElement(uri, localName, qName, attributes);
			System.out.println("--------------");
			System.out.println("uri:::"+uri);
			System.out.println("localName:::"+localName);
			System.out.println("qName::"+qName);
			System.out.println("attributes"+attributes);
			System.out.println("--------------");
		}
		
	}

}

执行结果是


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值