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("")), 判斷節點值不爲空時才進行輸出操做。