`

SAX解析XML

 
阅读更多
package com.jelly.xml;

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
/**
 * SAX解析XML
 * @author Jelly
 * QQ:136179492
 *
 */
public class SaxTest {

	/**
	 * @param args
	 * @throws SAXException 
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception{
		 //step 1:获得SAX解析工厂实例
		 SAXParserFactory factory = SAXParserFactory.newInstance();
		 //step 2:获得SAX解析实例
		 SAXParser saxParser = factory.newSAXParser();
		 //step 3:开始解析
		saxParser.parse(new File("Test.xml"), new SaxTest2());
	}
}

 

package com.jelly.xml;

import java.util.Stack;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * SAX解析XML Handler类
 * @author Jelly
 *
 */
public class SaxTest2 extends DefaultHandler{

	public Stack<String> stack = new Stack<String>();
	private String name;
	private String address;
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		
		stack.push(qName);
		for (int i = 0; i <attributes.getLength(); i++) {
			String name =	attributes.getQName(i);
			String value = attributes.getValue(i);
			System.out.println(name+"===="+value);
		}
	}
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		stack.pop();
		if("person".equals(qName)){
			System.out.println("姓名:"+this.name);
			System.out.println("地址:"+this.address);
		}
	}
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String tag =  stack.peek();
		if(tag.equals("name")){
			name = new String(ch,start,length); 
			this.name = name;
		}
		if(tag.equals("address")){
			this.address = new String(ch,start,length);
		}
	}
	
}

 

<?xml version="1.0" encoding="UTF-8"?>
<people>
	<person personId="s01">
		<name>jelly</name>
		<address>wufsfsfsfssf</address>
	</person>
	<person personId="s02">
		<name>jelly2</name>
		<address>chengdu</address>
	</person>
</people>

 Dom:
DOM 是处理 XML 数据的传统方法。使用 DOM 时,数据以树状结构的形式被加载到内存中。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵 DOM 树可能是一个缓慢的过程。
SAX:
SAX 处理涉及以下步骤:
1.创建一个事件处理程序。
2.创建 SAX 解析器。
3.向解析器分配事件处理程序。
4.解析文档,同时向事件处理程序发送每个事件。
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
另一方面,由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。
选择 DOM 还是选择 SAX,这取决于下面几个因素:
1.应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。
2.数据容量: 对于大型文件,SAX 是更好的选择。
数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。
3.对速度的需要: SAX 实现通常要比 DOM 实现更快。
SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics