使用SAX 解析XMl 通用哟

标签: sax 解析 xml | 发表时间:2012-07-30 12:17 | 作者:liulipuo
出处:http://blog.csdn.net

package com.popo.xml;

import java.io.IOException;
import java.io.StringBufferInputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;

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

import org.dom4j.io.DOMReader;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SAXParserFactory sf = SAXParserFactory.newInstance(); 
		MyDefaultHandler df = new MyDefaultHandler();
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
				"<data>"+
				"<grade gredenum='gd1'>" +
				"	<class classnum='cl1'>" +
				" 		<std name='xiaohong' age='16' />" +
				"		<std name='xiaoming' age='18' > =========================================================</std>" +
				"		<teacher name='tch_li' cource='chemistry'/>" +
				"		<teacher name='tch_jia' cource='physics'/>"+
				"	</class> " +
				"</grade >"+
				"<grade gredenum='gd2'>" +
				"	<class classnum='cl1'>" +
				" 		<std name='monkeysun' age='530' />" +
				"		<std name='bajiepig' age='360' />"+
				"		<std name='cleanwu' age='320' />"+
				"	</class> " +
				"	<class classnum='cl2'>" +
				"aafafafa" +
				"</class>" +
				"</grade >"+
				"</data>"
				;
		/**
		 * "<grade n='2'>" +
				"	<class n=1>" +
				" 		<std name='2l' age='22' />" +
				"		<std name='23' age='23' />"+
				"	</class> " +
				"	<class n=2>" +
				" 		<std name='2l' age='22' />" +
				"		<std name='23' age='23' />"+
				"	</class>"+
				"</grade >" +
				
		 */
        try {
			SAXParser sp = sf.newSAXParser();
			StringBufferInputStream in = new StringBufferInputStream(xml);
			sp.parse(in, df);
			System.out.println();
			Data data = df.root;
			System.out.println(data);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        
	}
	
	

}

/**
 * 设计的数据对象结构
 * @author liboliu
 *
 */
class Data{
	//Node的名字
	public String name=null;
	//包含的数据 此数据应该与son互斥
	public String data=null;
	//属性
	public HashMap<String, String> attr= null;
	//子数据
	public HashMap<String,ArrayList<Data>> son=null;
	
	 //对象翻译为XML
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		
		StringBuilder sb = new StringBuilder();
		//node名字
		sb.append("<"+name+" ");
		//属性
		if(attr!=null){
			Set<String> keys = attr.keySet();
			Iterator<String> it = keys.iterator();
			while(it.hasNext()){
				 String key_ = it.next();
				 sb.append(" "+key_+"="+ attr.get(key_)+" ");
				 
			 }
		}
		
		sb.append(" >\n");
		
		//包含的数据或子项
		if(son!=null){
			Set<String> keys =son.keySet();
			 Iterator<String> it = keys.iterator();
			 while(it.hasNext()){
				 String key_ = it.next();
				 ArrayList<Data> sonData = son.get(key_);
				 for(Data d :sonData){
					 sb.append(d);
				 }
				 
			 }
		}
		
		if(data!=null){
			sb.append(data+"\n");
		}
		//结束
		sb.append("</"+name+">\n");
		return sb.toString();
	}
	
}


class MyDefaultHandler extends DefaultHandler{
	
	
	
	LinkedList<Data> stack =null;

	Data parent = null;
	Data self =null;
	Data root =null;
	
	int step=0;
	LinkedList<Object> lo = new LinkedList<Object>();
	boolean newDowcument = true;
	public MyDefaultHandler() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		//释放
		stack=null;
		parent=null;
		self=null;
		super.endDocument();
		
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//解析完后自己出栈
		stack.removeFirst();
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		
	}
	
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		//初始化 root linklist
		root = new Data();
		//初始话栈
		stack= new LinkedList<Data>();
		//把root进栈
		stack.addFirst(root);
		super.startDocument();
	
	
	}
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {	
		//创建自己
		self = new Data();
		self.name=qName;
		//获取父对象这里应该 出栈后 在入栈 但是用 linkedList  直接获取栈顶数据  就不用 进行出入栈操作了
		parent = stack.peekFirst();
		//自己进栈
		stack.addFirst(self);
		//把自己添加到parent里面去
		addSelfInParent(self,parent,qName);
		//填充属性
//		System.out.println("uri="+uri+",localName:"+localName+",qName:"+qName);
		int attributesl =attributes.getLength();
		if(attributesl>0){
			self.attr = new HashMap<String, String>();
		}
		for(int i=0;i<attributesl;i++){
			
			self.attr.put(attributes.getLocalName(i), attributes.getValue(i));
		}
		super.startElement(uri, localName, qName, attributes);
	}
	
	/**
	 * 
	 * @param self
	 * @param parent
	 * @param key
	 */
	@SuppressWarnings("unchecked")
	private void addSelfInParent(Data self,
			Data parent,String key) {
		// TODO Auto-generated method stub
		
		if(parent.son==null){
			parent.son= new HashMap<String, ArrayList<Data>>();
			ArrayList<Data> d = new ArrayList<Data>();
			parent.son.put(key, d);
			d.add(self);
		}else{
			if(parent.son.containsKey(key)){
				parent.son.get(key).add(self);
			}else{
				ArrayList<Data> d = new ArrayList<Data>();
				parent.son.put(key, d);
				d.add(self);
			}
		}
	}
	
	@Override
	public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
		// TODO Auto-generated method stub
		self.data=new String(arg0,arg1,arg2);
		super.characters(arg0, arg1, arg2);
	}
	
}

这个是使用SAX将XML解析成对象 用到了栈



作者:liulipuo 发表于2012-7-30 12:17:27 原文链接
阅读:0 评论:0 查看评论

相关 [sax 解析 xml] 推荐:

xml sax解析

- - 移动开发 - ITeye博客
最近一直在做接口,主要用对xml的解析用的是sax,下面我对sax的几种写法做了一个测试:. System.out.println("耗时:"+(end-start));. System.out.println("当前 Java 虚拟机中的使用内存量:" + (freeMemory01-freeMemory02) + " 字节");.

java解析xml数据---sax解析器

- - ITeye博客
下面是handler解析数据的方法. private HashMap map = null;// 存储单个解析的完整对象. private List> list = null;// 存储全部的解析对象. private String currentTag = null; // 正在解析的元素的标签.

Android XML文档解析(一)——SAX解析

- - CSDN博客移动开发推荐文章
       此文章仅作为学习交流所用.        转载或引用请务必注明原文地址:.        或联系作者:[email protected] .     XML:extensible markup language,可扩展标记语言. 与HTML(超文本标记语言,即Hypertext Markup Language)一样,XML也是 标准通用标记语言 (SGML) 的子集,非常适合 Web 传输.

使用SAX 解析XMl 通用哟

- - CSDN博客推荐文章
} /** * 设计的数据对象结构 * @author liboliu * */ class Data{. //包含的数据 此数据应该与son互斥. //初始化 root linklist. //获取父对象这里应该 出栈后 在入栈 但是用 linkedList 直接获取栈顶数据 就不用 进行出入栈操作了.

android 或者java SAX解析XML

- - ITeye博客
本实例解析xml使用的是继承DefaultHandler类,此类就是java中封装好的xml解析器类,下面看代码详细说明:. 第一步:首先说明下xml文件,Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode.

SAX和DOM解析XML区别

- - 移动开发 - ITeye博客
本文转载自: http://blog.csdn.net/zhangxinrun/article/details/5678118. 还有一篇文章总结的也不错: http://www.kaifajie.cn/kecheng/java/7625.html借鉴一下,学习学习. 当你需要处理XML文档时,你的首要选择是使用DOM(文档对象模型)还是使用SAX(用于XML的简单API),即当前使用的两个主要的XML API.

android解析XML总结-SAX、Pull、Dom三种方式

- - CSDN博客移动开发推荐文章
     在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式. 最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下:.

用java sax处理xml文件(DBLP数据集)

- - CSDN博客综合推荐文章
在java中,可以用多种方式处理xml文件. 前一段时间因为要使用到dblp数据集,而且这个数据集比较大无法一次性加载到内存中解析成文档树再处理. 所以只能用sax的方式边读边处理. 下面是dblp数据集的简介,在处理xml文件之前,对xml的结构的了解很重要:. DBLP是计算机领域内对研究的成果以作者为核心的一个计算机类英文文献的集成数据库系统,按年代列出了作者的科研成果.

Android PULL解析XML

- - CSDN博客移动开发推荐文章
int eventType = parser.getEventType();//产生第一个事件. while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件. String name = parser.getName();//获取解析器当前指向的元素的名称.

Android DOM解析XML

- - CSDN博客移动开发推荐文章
if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点. 作者:jaycee110905 发表于2013-2-7 21:04:29 原文链接. 阅读:78 评论:0 查看评论.