(此文為(https://www.imooc.com/video/4482)之隨筆)
1、用SAX解析xml文件大致分為三步
寫了一個XML文件作為例子
(1)main方法代碼如下:
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class SAX { public static void main(String[] args) { //1、獲取一個SAXParserFactory的實例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //2、通過factory獲取SAXParser的實例 SAXParser parser = factory.newSAXParser(); //3、創建SAXParserHandler對象 SAXParserHandler handler = new SAXParserHandler(); parser.parse("book.xml", handler); } 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(); } } }
(2)SAXParserHandler方法
package cn.edu.zzuli.SAXTest; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandler extends DefaultHandler { /** * 用來遍歷xml文件的開始標簽 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); } /** * 用來遍歷xml文件的結束標簽 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); } /** * 用來表示解析開始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析開始"); } /** * 用來表示解析結束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析結束"); } }
當讀到<?xml version="1.0" encoding="UTF-8"?>時解析開始,當讀到最后一個節點結束標識(</>)解析結束
2、使用SAX解析節點名和節點間文本
重寫SAXParserHandler類里的startElement方法
public class SAXParserHandler extends DefaultHandler { int bookindex = 1; /** * 用來遍歷xml文件的開始標簽 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //調用DefaultHandler類的startElement方法 super.startElement(uri, localName, qName, attributes); //開始解析book元素的屬性 if(qName.equals("book")) { System.out.println("------------現在開始遍歷第" + bookindex + "本書---------"); //已知book元素下屬性的名稱,根據名稱獲取屬性值 String value = attributes.getValue("id"); System.out.println("book的屬性值是:" + value); //不知道book元素下屬性的名稱以及個數,如何獲取元素名稱及屬性 int num = attributes.getLength(); for(int i = 0;i < num;i++) { System.out.print("第" + (i + 1) + "個book元素的屬性名是" + attributes.getQName(i)); System.out.println("----book元素的屬性值是" + attributes.getValue(i)); } }else if(!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("節點名是" + 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(qName.equals("book")) { System.out.println("------------結束遍歷第" + bookindex++ + "本書---------"); } } /** * 用來表示解析開始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析開始"); } /** * 用來表示解析結束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析結束"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); String value = new String(ch, start, length);
//通過trim()截掉空格和換行符,如果是空字符則跳過if執行語句 if(!value.trim().equals("")) System.out.println("節點值為" + value); } }
輸出結果為:
(2)將book節點結構信息保存,用一個book類來保存
重新寫SAXParserHandler類
public class SAXParserHandler extends DefaultHandler { int bookindex = 1; //定義全局變量是為了使book對象和value值可以被多個方法訪問 Book book =null; String value = null; private ArrayList<Book> bookList = new ArrayList<>(); public ArrayList<Book> getBookList() { return bookList; } /** * 用來遍歷xml文件的開始標簽 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //調用DefaultHandler類的startElement方法 super.startElement(uri, localName, qName, attributes); //開始解析book元素的屬性 if(qName.equals("book")) { //每一次遇到book就建立新的book對象 book = new Book(); System.out.println("------------現在開始遍歷第" + bookindex + "本書---------"); //已知book元素下屬性的名稱,根據名稱獲取屬性值 String value = attributes.getValue("id"); System.out.println("book的屬性值是:" + value); //不知道book元素下屬性的名稱以及個數,如何獲取元素名稱及屬性 int num = attributes.getLength(); for(int i = 0;i < num;i++) { System.out.print("第" + (i + 1) + "個book元素的屬性名是" + attributes.getQName(i)); System.out.println("----book元素的屬性值是" + attributes.getValue(i)); if(attributes.getQName(i) == "id") { book.setId(attributes.getValue(i)); } } }else if(!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("節點名是" + 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(qName.equals("book")) { //把信息存入book對象之后,加到ArrayList之中 bookList.add(book); //將book對象清空 book = null; System.out.println("------------結束遍歷第" + bookindex++ + "本書---------"); }else if(qName.equals("name")) { book.setName(value); }else if(qName.equals("id")) { book.setId(value); }else if(qName.equals("year")) { book.setYear(value); }else if(qName.equals("money")) { book.setMoney(value); }else if(qName.equals("color")) { book.setColor(value); }else if(qName.equals("auther")) { book.setAuther(value); } } /** * 用來表示解析開始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析開始"); } /** * 用來表示解析結束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析結束"); }
/** * 用來求得節點值 */
@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);
}