SAX解析XML

package com.test;


import java.io.File;
import java.io.IOException;

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

import org.xml.sax.SAXException;

/**
 * 
 * @Description:SAX解析
 * SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。
 * 而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
 * 这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;
 * 它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 
  SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,
  当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
  SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,
  SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据
 * 
 */
public class SaxXmlReader {
	
	public void test()
	{
		try {
			//创建sax工厂
			SAXParserFactory  saxFactory = SAXParserFactory.newInstance();
			
			SAXParser saxParse = saxFactory.newSAXParser();
			
			//产生一个事件监听器
			MySaxHandler xmlHandler = new MySaxHandler();
			
			//解析这个流,并注册监听器
			saxParse.parse(new File("F:\\bb.xml"), xmlHandler);
			
			System.out.println(xmlHandler.getPersons());
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		SaxXmlReader  demo = new SaxXmlReader();
		demo.test();
	}
}
package com.test;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 
 * xml文件被Sax解析器载入,由于Sax解析是按照xml文件的顺序来解析,当读入<?xml.....>时,
 * 会调用startDocument()方法,当读入<books>的时候,由于它是个ElementNode,
 * 所以会调用startElement(String uri, String localName, String qName, Attributes attributes) 方法,
 * 其中第二个参数就是节点的名称,注意:由于有些环境不一样,有时候第二个参数有可能为空,
 * 所以可以使用第三个参数,因此在解析前,先调用一下看哪个参数能用,第4个参数是这个节点的属性 
 */
public class MySaxHandler extends DefaultHandler{
	
	private ArrayList<Person> persons;  
	
    private Person person; 
    
    private String tagName;
	
	public ArrayList<Person> getPersons() 
	{
		return persons;
	}

	@Override  
    public void startDocument() throws SAXException 
    {  
        this.persons = new ArrayList<Person>();  
    }
	
	//开始读数据
	@Override
	public void startElement(String uri, String localName,String qName, Attributes attributes)
	{
		this.tagName = qName;  
		
        if(this.tagName.equals("person"))
        {  
            person = new Person();  
            person.setId(Integer.parseInt(attributes.getValue(0)));  
        }
	}
	
	// 取出数据
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException 
	{
		if (this.tagName != null) 
		{  
            String data = new String(ch, start, length);  
            
            if (this.tagName.equals("name")) 
            {  
                this.person.setName(data);  
            } 
            else if (this.tagName.equals("age")) 
            {  
                this.person.setAge(Integer.parseInt(data));  
            }  
        }
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)throws SAXException 
	{
		if (qName.equals("person")) 
		{
			this.persons.add(person);
		}
		this.tagName = null;
	}

}

public class Person {
	    private int id;  
	    private String name;  
	    private int age;  
	    public Person() {  
	  
	    }  
	    public Person(int id, String name, int age) {  
	        this.id = id;  
	        this.name = name;  
	        this.age = age;  
	    }  
	    public int getId() {  
	        return id;  
	    }  
	  
	    public void setId(int id) {  
	        this.id = id;  
	    }  
	    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;  
	    }  
	    @Override  
	    public String toString() {  
	        return "姓名:" + this.name + ",年龄:" + this.age;  
	    }  

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE RESULT>
<persons>  
    <person id="1">
        <name>张三</name>
        <age>24</age>
    </person>
    <person id="2">
        <name>李四</name>
        <age>25</age>
    </person>
    <person id="3">  
        <name>王五</name>  
        <age>26</age>  
    </person>  
</persons>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值