用SAX解析xml文件,java


(此文為(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);
    }

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM