使用SAX解析XML文件

  1:SAX方法解析:(SAX是边扫描边解析,自顶而下依次解析。

    1):通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory

    2):通过SAXParserFactory实例的newInstace()方法返回SAXParser实例parser

    3):创建一个类继承DefaultHandler,重写其中的一些方法进行业务处理并创建这个类的实例handler

public class SAXParserHandler extends DefaultHandler{
	/**
	 * 用来标志解析开始
	 */
	@Override
    public void startDocument ()throws SAXException{
		super.startDocument();
		System.out.println("SAX解析开始");
    }
	
	/**
	 * 用来遍历xml文件的开始标签
	 * uri:xml文档的命名空间
	 * localName:标签的名字
	 * qName:带命名空间的标签的名字
	 * attributes:标签的属性集
	 */
	@Override
	public void startElement (String uri, String localName,String qName, Attributes attributes)throws SAXException
	{
		super.startElement(uri, localName, qName, attributes);
	}	
	/**
	 * 用来遍历xml文件的结束标签
	 * @throws SAXException 
	 */
	/**
	 * 解析标签内容的时候调用
	 */
	@Override
	public void characters(char[] ch,int start,int length) throws SAXException{
		super.characters(ch, start, length);
	}
	
	@Override
    public void endElement (String uri, String localName, String qName)throws SAXException
    {
           super.endElement(uri, localName, qName);
    }

	/**
	 * 用来标志解析结束
	 */
	@Override
	public void endDocument() throws SAXException{
		super.endDocument();
		System.out.println("SAX解析结束");
	}
}
完成代码加注释:
    1):xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="1">
		<name>c</name>
		<year>2014</year>
		<price>89</price>
	</book>
	<book id="2">
		<name>数据结构</name>
		<year>2004</year>
		<price>89</price>
		<language>English</language>
	</book>
</bookstore>

 2):实体类  

package com.xml.enty;

public class Book {
	private String id;
	private String name;
	private String year;
	private String author;
	private String language;
	private String price;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	
}

  3):Handler类:

public class SAXParserHandler extends DefaultHandler{
	//定义全局变量bookIndex用来标记是第几本书
	int bookIndex=0;
	String value=null;
	Book book=null;
	private ArrayList<Book> booklist=new ArrayList<Book>();
	public ArrayList<Book> getBooklist() {
		return booklist;
	}
	public void setBooklist(ArrayList<Book> booklist) {
		this.booklist = booklist;
	}
	/**
	 * 用来标志解析开始
	 */
	@Override
    public void startDocument ()throws SAXException{
		super.startDocument();
		System.out.println("SAX解析开始");
    }
	


	/**
	 * 用来遍历xml文件的开始标签
	 * uri:xml文档的命名空间
	 * localName:标签的名字
	 * qName:带命名空间的标签的名字
	 * attributes:标签的属性集
	 */
	@Override
	public void startElement (String uri, String localName,String qName, Attributes attributes)throws SAXException
	{
		super.startElement(uri, localName, qName, attributes);
		/*  已知book元素下的属性,根据属性名称来获取值
		if(qName.equals("book")){
			String value=attributes.getValue("id");
			System.out.println("book的属性值是"+value);
		}*/
		
		//开始遍历book节点
		//如果不知道book元素下属性的名称以及个数
		if(qName.equals("book")){
			//创建一个book对象
			book=new Book();
			bookIndex++;
			System.out.println("----开始遍历第"+bookIndex+"本书");
			int num=attributes.getLength();
			for(int i=0;i<num;i++){
				System.out.print("book元素的第"+(i+1)+"个属性名为:"+attributes.getQName(i));
				System.out.println("--->属性值为:"+attributes.getValue(i));
				if(attributes.getQName(i).equals("id")){
					book.setId(attributes.getValue(i));
				}
			}
		}
		//遍历子结点
		else if(!qName.equals("book")&&!qName.equals("bookstore")){
			System.out.print("节点名为:"+qName);
		}
	}	
	/**
	 * 用来遍历xml文件的结束标签
	 * @throws SAXException 
	 */
	/**
	 * 解析标签内容的时候调用
	 * ch:节点中的所有内容
	 * 
	 */
	@Override
	public void characters(char[] ch,int start,int length) throws SAXException{
		super.characters(ch, start, length);
			value=new String(ch,start,length);
			//用trime方法来判断内容是否是空
			if(!value.trim().equals("")){
				System.out.println("-->节点值为:"+value);
			}
	}
	
	@Override
    public void endElement (String uri, String localName, String qName)throws SAXException
    {
		//调用DefaultHandler类的endElement方法
           super.endElement(uri, localName, qName);
        //判断是否针对一本书已经遍历结束
           	if(qName.equals("book")){
           		//加入到BookList中去
           		booklist.add(book);
           		//清空book,准备存储下一本书的信息
           		book=null;
           		System.out.println("------结束遍历第"+bookIndex+"本书");
           	}else if(qName.equals("name")){
           		book.setName(value);
           	}else if(qName.equals("year")){
           		book.setYear(value);
           	}else if(qName.equals("author")){
           		book.setAuthor(value);
           	}else if(qName.equals("price")){
           		book.setPrice(value);
           	}else if(qName.equals("language")){
           		book.setLanguage(value);
           	}
    }

	/**
	 * 用来标志解析结束
	 */
	@Override
	public void endDocument() throws SAXException{
		super.endDocument();
		System.out.println("SAX解析结束");
	}
}

4): 测试类:

public class SAXTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory
		SAXParserFactory factory=SAXParserFactory.newInstance();
		try {
			//通过factory获取SAXParser实例
			SAXParser parser=factory.newSAXParser();
			//创建SAXParserHandler对象
			SAXParserHandler handle=new SAXParserHandler();
			parser.parse("books.xml",handle);
			for(Book book:handle.getBooklist()){
				System.out.println(book.getId());
				System.out.println(book.getName());
				System.out.println(book.getAuthor());
				System.out.println(book.getYear());
				System.out.println(book.getPrice());
				System.out.println(book.getLanguage());
				System.out.println("---finish");
			}
		} 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();
		}	
	}
}

SAX解析的优缺点:

    -优点:

        1):采取事件驱动,对内存耗费比较小

扫描二维码关注公众号,回复: 2249389 查看本文章

        2):适用于只需要处理xml中数据时

    -缺点:

        1):不易解析

        2):很难同时访问同一个xml中的多处不同数据

猜你喜欢

转载自blog.csdn.net/phoenix_tgd/article/details/79943681