Java 使用SAX解析XML文檔

DOM,即Document Object Model,中文叫文檔對象模型。DOM是W3C定義的標準文檔對象模型,是一個與操做系統和編程語言無關的、用於內存存儲和操做層次化文檔的模型。當按 照DOM模型解析XML文檔時,就會在內存中構造一個對應的DOM樹,它能夠用於不一樣節點之間的遍歷。然而,在遍歷以前必須先完成DOM樹的構造。所以, 在處理規模較大的XML文檔時就很耗內存,佔用資源較多。尤爲是隻須要操做文檔中一小部分時效率很低。java

SAX,即Simple API for XML的簡稱,中文叫XML簡單應用程序接口。它是一個事實上的標準。與DOM不一樣的是,它是用事件驅動模型。解析XMl文檔時每遇到一個開始或者結束標 籤、或者屬性、或者一條指令時,程序就產生一個事件來進行相應的處理。因此在操做文檔以前不須要對整個文檔進行解析。實際上,文檔的各個部分能夠在進行解 析的同時進行操做。所以,SAX相對於DOM來講更適合操做大文檔。編程

下面介紹一下SAX解析XML文檔的方法:編程語言

1.經過SAXParserFactory的靜態newInstance()方法獲取SAXParserFactory實例ide

SAXParserFactory factory = SAXParserFactory.newInstance();

2.經過SAXPareserFactory實例的newSAXParser()方法返回SAXParser實例操作系統

SAXParser parser = factory.newSAXParser();

3.建立一個類繼承DefaultHandler,重寫其中的一些方法來處理業務,並建立這個類的實例code

4.調用parse()方法進行解析xml

File f = new File("book.xml");      
parser.parse(f, sdh);

下面仍是直接上例子吧。對象

xml文件繼承

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
    <book id="1">
        <name>111</name>
        <author>222</author>
    </book>
    <book id="2">
        <name>333</name>
        <author>444</author>
    </book>
</bookstore>

具體實現接口

SAXxml.java

package com.lpp.test;
import java.io.File;
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.lpp.handler.SAXHeadler;

public class SAXxml
{
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try
        {
            SAXParser parser = factory.newSAXParser();
            SAXHeadler sdh=new SAXHeadler();
            File f = new File("book.xml"); 
            parser.parse(f, sdh);
            
        } catch (ParserConfigurationException | SAXException | IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

SAXHandler.java

package com.lpp.handler;

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

public class SAXHeadler extends DefaultHandler
{
    @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);
        System.out.println("開始解析"+qName);
        if(qName.equals("book"))
        {
            String value = attributes.getValue("id");
            System.out.println("id:"+value);
            System.out.println();
        }
        else if(qName.equals("bookstore"))
        {
            System.out.println();
        }
        else if(!qName.equals("book")&&!qName.equals("bookstore"))
        {
            System.out.println("節點名:"+qName);
        }
    //  System.out.println();
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException
    {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);        
        System.out.println("結束解析"+qName);
        System.out.println();
    }
    @Override
    public void startDocument() throws SAXException
    {
        // TODO Auto-generated method stub
        super.startDocument();
        System.out.println("開始解析xml文檔");
        System.out.println();
    }
    
    @Override
    public void endDocument() throws SAXException
    {
        // TODO Auto-generated method stub
        super.endDocument();
        System.out.println("結束解析xml文檔");
        System.out.println();
    }
    
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException
    {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        String chs=new String(ch, start, length);
        if(!chs.trim().equals(""))
        {
            System.out.println("節點值:"+chs);
        }
    }
}

注意 xml文檔中會有空白的節點值,因此在重寫characters()方法時,加上了判斷條件。String chs=new String(ch, start, length); if(!chs.trim().equals("")), 判斷節點值不爲空時才進行輸出操做。

相關文章
相關標籤/搜索