XML文檔的SAX解析

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<books> <!--根節點--><!--這裏的空白也算一個節點,所以books共有5個子節點-->
	<book id="book1" w="wwwww">
		<name><a>AAAAAA</a>bookName1</name>
		<price>10.0</price>
	</book>
	<book id="book2">
		<name>bookName2</name>
		<author>bookAuthor2</author>
	</book>
</books>


測試類:

package com.zhang.xml.sax;

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

/*
 * sax解析是逐行掃描文檔,一邊掃描一邊解析。
 * 需要創建一個org.xml.sax.helpers.DefaultHandler的繼承類
 */
public class SaxParse {

	public static void main(String[] args) throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		
		SaxParser handler = new SaxParser();
		parser.parse("books.xml", handler);
		
		System.out.println(handler.getBooks());
	}

}


org.xml.sax.helpers.DefaultHandler的子類
package com.zhang.xml.sax;

import java.util.ArrayList;
import java.util.List;

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

import com.zhang.xml.bean.Book;

public class SaxParser extends DefaultHandler {
	
	private int index = 0;
	private List<Book> books = new ArrayList<Book>();
	private Book book = null;
	private String value = null;
	
	public List<Book> getBooks() {
		return books;
	}

	/**
	 * 用來標識解析開始
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("----------開始解析文檔----------");
	}
	
	/**
	 * 用來標識解析結束
	 */
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
		System.out.println("----------結束文檔解析----------");
	}
	
	/**
	 * 解析一個xml元素
	 * 每遇到一個元素的開始標籤就調用一次該方法
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		if("book".equals(qName)){
			index++;
			System.out.println("---開始解析第" + index + "個book標籤---");
			book = new Book();
			
			int size = attributes.getLength();
			for(int i=0; i<size; i++) {
				System.out.print("第" + (i + 1) + "個屬性名: " + attributes.getQName(i));
				System.out.println("-->屬性值:" + attributes.getValue(i));
				
				if("id".equals(attributes.getQName(i))) {
					book.setId(attributes.getValue(i));
				}
			}
		} else {
			System.out.println("遇到" + qName + "開始標籤");			
		}
		
	}
	
	/**
	 * 結束一個解析xml元素
	 * 每遇到一個元素的結束標籤就調用一次該方法
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		if("book".equals(qName)){
			System.out.println("---結束解析第" + index + "個book標籤---");
			
			books.add(book);
			book = null;
		} else if("name".equals(qName)) {
			book.setName(value);			
		} else if("price".equals(qName)) {
			book.setPrice(value);			
		} else if("author".equals(qName)) {
			book.setAuthor(value);			
		} else {
			System.out.println("遇到" + qName + "結束標籤");
		}
	}
	
	/*
	 *	ch中存放着xml文檔中所有的元素的值,每遇到一個元素的值,就調用一次該方法
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		value = new String(ch, start, length);
		if (!value.trim().equals("")) {	 //	排除空白位置 
			System.out.println("-->value值:" + value);
		}
		
	}
}


結果:

----------開始解析文檔----------
遇到books開始標籤
---開始解析第1個book標籤---
第1個屬性名: id-->屬性值:book1
第2個屬性名: w-->屬性值:wwwww
遇到name開始標籤
遇到a開始標籤
-->value值:AAAAAA
遇到a結束標籤
-->value值:bookName1
遇到price開始標籤
-->value值:10.0
---結束解析第1個book標籤---
---開始解析第2個book標籤---
第1個屬性名: id-->屬性值:book2
遇到name開始標籤
-->value值:bookName2
遇到author開始標籤
-->value值:bookAuthor2
---結束解析第2個book標籤---
遇到books結束標籤
----------結束文檔解析----------
[Book [id=book1, name=bookName1, price=10.0, author=null], Book [id=book2, name=bookName2, price=null, author=bookAuthor2]]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章