SAX解析原理:
?使用Handler去逐個分析遇到的每一個節點
SAX方式解析步奏:
創建xml解析需要的handler(parser.parse(file,handler))?
package com.imooc_xml.sax.handler;import java.util.ArrayList;import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;import com.imooc_xml.sax.entity.Book;public class SAXParserHandler extends DefaultHandler {//使用全局變量可以使本類的各個方法通用,聯系int bookIndex = 0 ;String value = null;Book book = null;private ArrayList<Book> bookList = new ArrayList<Book>();public ArrayList<Book> getBookList() {return bookList;}/*** 用來遍歷xml文件的開始標簽*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// TODO Auto-generated method stubsuper.startElement(uri, localName, qName, attributes);解析xml文件的節點屬性,只有book節點有屬性if(qName.equals("book")){book = new Book();bookIndex++;//已知book的屬性名 // attributes.getValue("id");//不知book元素的屬性名和個數int num = attributes.getLength();for(int i=0;i<num;i++){//book元素的第i+1個屬性名 attributes.getQName(i);attributes.getValue(i);if(attributes.getQName(i).equals("id")){book.setId(attributes.getValue(i));}}}else if (!qName.equals("book")&&!qName.equals("bookstore")){//節點名 System.out.println(qName);}}/*** 用來遍歷xml文件的結束標簽*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, qName);//判斷是否針對一本書已經遍歷結束if (qName.equals("book")){bookList.add(book);book = null;System.out.println("結束遍歷第"+bookIndex+"本書");}else if(qName.equals("name")){book.setName(value);}else if(qName.equals("author")){book.setAuthor(value);}else if(qName.equals("year")){book.setYear(value);}else if(qName.equals("price")){book.setPrice(value);}else if(qName.equals("language")){book.setLanguage(value);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);//ch是節點之間的文本內容value = new String(ch, start, length);//判斷空格和換行if(!value.trim().equals("")){System.out.println(value);}}/*** 用來標志解析開始*/@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubsuper.startDocument();System.out.println("SAX解析開始");}/*** 用來標志解析結束*/@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();System.out.println("SAX解析結束");} }
創建hanlder類
SAX解析準備工作:
package com.imooc_xml.sax.test;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import com.imooc_xml.sax.handler.SAXParserHandler;public class SAXTest {public static void main(String[] args) {//通過SAXParserFactory的靜態newInstance()方法獲取SAXParserFactory的實例factorySAXParserFactory factory = SAXParserFactory.newInstance();try {//通過factory獲取SAXParser實例SAXParser parser = factory.newSAXParser();//創建一個handler對象SAXParserHandler handler = new SAXParserHandler();parser.parse("xml/books.xml", handler);} catch (ParserConfigurationException | SAXException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}} }
?使用SAX解析xml文件的節點屬性:
//只有book節點有屬性if(qName.equals("book")){//已知book的屬性名 // attributes.getValue("id");//不知book元素的屬性名和個數‘int num = attributes.getLength();for(int i=0;i<num;i++){//book元素的第i+1個屬性名 attributes.getQName(i);attributes.getValue(i);}}
使用SAX解析xml文件的節點值
@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);//ch是節點之間的文本內容value = new String(ch, start, length);//判斷空格和換行if(!value.trim().equals("")){System.out.println(value);}}
?
在Java中保留xml數據的結構
public class Book {private String id;private String name;private String author;private String year;private String price;private String language;
獲取對象集合:
handler.getBookList().size();for(Book book:handler.getBookList()){System.out.println(book.getId());
....}
?