`
yuanlanjun
  • 浏览: 1184675 次
文章分类
社区版块
存档分类
最新评论

使用SAX 解析XMl 通用哟

 
阅读更多

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解析成对象 用到了栈



分享到:
评论

相关推荐

    Android SAX 解析XML

    Android SAX 解析XML SAX 解析XML(通用)

    sax解析xml尤其是获取元素的值或者内容

    NULL 博文链接:https://wang-peng1.iteye.com/blog/1133695

    jsp操作xml源码,解析器为DOM和SAX

    利用JSP直接读写XML文件,分别用DOM解析器和SAX解析器加以实现,非常适合初学者入门,作为一个了解jsp与XML的台阶

    PULL解析xml的demo

    通用性强,它会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据; 优点:简单直观,但需要将文档读取到内存, 缺点:并不太适合移动设备; 2,SAX SAX是一个解析速度快并且占用内存少的...

    解析XML的三种方式

    XML(Extensible Markup Language)可拓展标记语言,它与HTML一样,都是SGML...在Android下有三种方式解析XML,分别为SAX、DOM、PULL;它们有各自的特点,在网络编程中会经常使用,根据实际情况选择哪一种解析方式。

    读取XML文件的四种方法

    读取XML文件的四种方法,详细介绍了dom,jdom,dom4j,sax

    详解Java解析XML的四种方法.doc

    本文档主要讲述的是详解Java解析XML的四种方法;XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。 本文使用JAVA语言来实现DOM与SAX的XML文档生成与...

    DOM和SAX概念的总结

    通常我们使用根据以下这些模型创建的API 来分析和操纵XML结构,这些模型可以是基于对象(基于树)的,如文档对象模型...而Java API for XML Parsing(JAXP)和MSXML提供了使用 DOM、SAX等处理XML文档的通用接口。

    XMLParser:使用SAX的XML Parser,库JDOM。 它不是通用的。 代码将为您提供一个如何构建通用XMLParser的想法

    XMLParser 示例文件的XML分析器。 它不是通用的。 代码将为您提供一个如何解析XML文件的想法。

    详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document ...

    Android程序技术:个人学习助手项目习题详情显示.pptx

    SAX解析 一个开源的Java项目,既可以用于Android应用,也可以用于JavaEE程序。Android中已经集成了PULL解析器。 PULL解析 XML解析 XML parsing XmlPullParser.START_DOCUMENT:XML文档的开始,如&lt;?xml

    xml入门教程/xml入门教程

    7) XML继承自SGML(标准通用标记语言)。SGML的前身GML由IBM在1960年发明,用于描述设备无关的文本 8) XML是SGML的子语言,由SGML简化而来,起初的目的是为Web的结构文档提供服务。 9) W3C组织在1998年2月10日发布...

    JAVA解析XML的四种方法比较

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document ...

    XML高级编程pdf

    8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 9.1.2 动态转换 9.1.3 不同的浏览器 9.2 XSL 9.3 XSLT 样式表结构 9.3.1 ...

    JAVA解析XML的_比较方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document ...

    xml入门经典-part3(中文版)

    目 录 译者序 作者简介 前言 第1章 XML简介 1.1 标记语言 1.2 XML的起源和目的 1.3 Web体系结构:过去与未来 1.3.1 传统Web体系结构 1.3.2 XML下的Web体系结构 ...9.5 使用DOM进行XML文档的转换

    XML 文件解析 DOM DOM4j JDOM SAX 和相对路径的写法 ,代码是有注释的

    有四种方法 DOM DOM4j JDOM SAX 和相对路径的写法 ,代码是有注释的,通用型的……应该对大家有帮助

    XML 高级编程(高清版)

    8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 9.1.2 动态转换 9.1.3 不同的浏览器 9.2 XSL 9.3 XSLT 样式表结构 9.3.1 ...

    XML高级编程 (Extensible Markup Language)

    8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 9.1.2 动态转换 9.1.3 不同的浏览器 9.2 XSL 9.3 XSLT 样式表结构 9.3.1 ...

Global site tag (gtag.js) - Google Analytics