xml sax解析

标签: xml sax 解析 | 发表时间:2014-01-05 11:17 | 作者:show213
出处:http://www.iteye.com
最近一直在做接口,主要用对xml的解析用的是sax,下面我对sax的几种写法做了一个测试:

public class TestSax {
	MyHandler handler;
	public List<Student> inFile01(String str){
			SAXParserFactory spf=SAXParserFactory.newInstance();
			SAXParser sap;
			try {
				sap = spf.newSAXParser();
				handler=new MyHandler();
				sap.parse(str, handler);
			} catch (Exception e){
				
				
			}
		return handler.getList();		
	}
	
	public List<Student> inFile02(File file){
		InputStream is;		
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser sap;
		try {
			is = new FileInputStream(file);			
			sap = spf.newSAXParser();
			handler=new MyHandler();
			sap.parse(is, handler);
		} catch(Exception e){			
			
		}	
		return handler.getList();		
	}
	public List<Student> inFile03(File file){
		InputStream is;		
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser sap;
		try {
			is = new FileInputStream(file);			
			sap = spf.newSAXParser();
			XMLReader xr=sap.getXMLReader();			
			handler=new MyHandler();
			xr.setContentHandler(handler);
			xr.parse(new InputSource(is));
		} catch(Exception e){			
			
		}	
		return handler.getList();		
	}
	
	
	
	public static void main(String args[]) throws FileNotFoundException{
		TestSax ts=new TestSax();
		
		long start=System.currentTimeMillis();
		long freeMemory01 =Runtime.getRuntime().freeMemory();
		
		//List<Student> list=ts.inFile02(new File("F:/student.xml"));	
		List<Student> list=ts.inFile01("F:/student.xml");
		
		long end=System.currentTimeMillis();
		long freeMemory02 =Runtime.getRuntime().freeMemory();
		
		System.out.println("耗时:"+(end-start));
		System.out.println("当前 Java 虚拟机中的使用内存量:" + (freeMemory01-freeMemory02) + " 字节");
		
		for(Student stu:list){	
			System.out.println(stu.getName());
			System.out.println(stu.getAge());
			System.out.println(stu.getEnglish());
		}
		
	}

}




public class MyHandler extends DefaultHandler {
	
	
	 Student st=null;
	 String preTag = null;
	 String currentTag=null;
	 
	

	List<Student> list;
	
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		list=new ArrayList<Student>();
	}
	
	
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {		
		super.startElement(uri, localName, qName, attributes);
		currentTag=qName;		
		if(currentTag.equals("info"))
		st=new Student();
		preTag=qName;			//将正在解析的节点名称赋给preTag	
	
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		String text = new String(ch, start, length);
		
		if(preTag==null) return;    		
		
		if(currentTag.equals("name"))
		{
			st.setName(text);  
				
		}else if(currentTag.equals("age")){
		
			st.setAge(Integer.parseInt(text));   			
		}else if(currentTag.endsWith("english")){
			
			st.setEnglish(Integer.parseInt(text));  
		}
		
	}
	
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		if("info".equals(qName)){ 			
			list.add(st);
			st=null;
		} 
		preTag=null;
	
	}
	
	 public List<Student> getList() {
			return list;
	 }

}



public class Student {
	
	
	public Student(){		
		
	}
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getEnglish() {
		return English;
	}
	public void setEnglish(int english) {
		English = english;
	}

	private String name;
	private int age;
	private int English;

}



<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<students>
	<info>
		<name>Lily</name>
		<age>18</age>
		<english>60</english>
	</info>
	<info>
		<name>Bobi</name>
		<age>19</age>
		<english>70</english>
	</info>
	<info>
		<name>Lucky</name>
		<age>20</age>
		<english>80</english>
	</info>
	<info>
		<name>Lucy</name>
		<age>21</age>
		<english>80</english>
	</info>
	<info>
		<name>Amy</name>
		<age>23</age>
		<english>90</english>
	</info>

	<info>
		<name>Jeff</name>
		<age>20</age>
		<english>56</english>
	</info>
	
	<info>
		<name>Michel</name>
		<age>25</age>
		<english>56</english>
	</info>
	
	<info>
		<name>Jay</name>
		<age>30</age>
		<english>56</english>
	</info>
</students>



对上面的三个方法我测试了一下:
93 milliseconds 2071984 字节   inFile01
93 milliseconds 2055512 字节   inFile02
78 milliseconds 2055504 字节   inFile03

从上面的测试结果来看,如果有可能,尽可能的用到xmlReader这个。


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [xml sax 解析] 推荐:

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博客移动开发推荐文章
       此文章仅作为学习交流所用.        转载或引用请务必注明原文地址:.        或联系作者:luzhenrong45@gmail.com .     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 查看评论.