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]]