SAX解析示例程式碼和原理
阿新 • • 發佈:2018-11-21
import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * 第一個SAX讀取xml檔案程式 * @author APPle * */ public class Demo1 { public static void main(String[] args) throws Exception{ //1.建立SAXParser物件 SAXParser parser = SAXParserFactory.newInstance().newSAXParser();//2.呼叫parse方法 /** * 引數一: xml文件 * 引數二: DefaultHandler的子類 */ parser.parse(new File("./src/contact.xml"), new MyDefaultHandler()); } }
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /*** SAX處理程式(如何解析xml文件) * @author APPle * */ public class MyDefaultHandler extends DefaultHandler { /** * 開始文件時呼叫 */ @Override public void startDocument() throws SAXException { System.out.println("MyDefaultHandler.startDocument()"); } /** * 開始標籤時呼叫 *@param qName: 表示開始標籤的標籤名 * @param attributes: 表示開始標籤內包含的屬性列表 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement()-->"+qName); } /** * 結束標籤時呼叫 * @param qName: 結束標籤的標籤名稱 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("MyDefaultHandler.endElement()-->"+qName); } /** * 讀到文字內容的時呼叫 * @param ch: 表示當前讀完的所有文字內容 * @param start: 表示當前文字內容的開始位置 * @param length: 表示當前文字內容的長度 * char[]( 張三 20) 100 * 98 2 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { //得到當前文字內容 String content = new String(ch,start,length); System.out.println("MyDefaultHandler.characters()-->"+content); } /** * 結束文件時呼叫 */ @Override public void endDocument() throws SAXException { System.out.println("MyDefaultHandler.endDocument()"); } }
日誌輸出:
MyDefaultHandler.startDocument() MyDefaultHandler.startElement()-->contactList MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->name MyDefaultHandler.characters()-->張三 MyDefaultHandler.endElement()-->name MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->age MyDefaultHandler.characters()-->20 MyDefaultHandler.endElement()-->age MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->phone MyDefaultHandler.characters()-->134222223333 MyDefaultHandler.endElement()-->phone MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->email MyDefaultHandler.characters()-->[email protected] MyDefaultHandler.endElement()-->email MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->qq MyDefaultHandler.characters()-->432221111 MyDefaultHandler.endElement()-->qq MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->name MyDefaultHandler.characters()-->李四 MyDefaultHandler.endElement()-->name MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->age MyDefaultHandler.characters()-->20 MyDefaultHandler.endElement()-->age MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->phone MyDefaultHandler.characters()-->134222225555 MyDefaultHandler.endElement()-->phone MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->email MyDefaultHandler.characters()-->[email protected] MyDefaultHandler.endElement()-->email MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->qq MyDefaultHandler.characters()-->432222222 MyDefaultHandler.endElement()-->qq MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contactList MyDefaultHandler.endDocument()
import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * 讀取contact.xml檔案,完整輸出文件內容 * @author APPle * */ public class Demo2 { public static void main(String[] args)throws Exception { //1.建立SAXParser SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.讀取xml檔案 MyDefaultHandler2 handler = new MyDefaultHandler2(); parser.parse(new File("./src/contact.xml"), handler); String content = handler.getContent(); System.out.println(content); } }
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX處理器程式 * @author APPle */ public class MyDefaultHandler2 extends DefaultHandler { //儲存xml文件資訊 private StringBuffer sb = new StringBuffer(); //獲取xml資訊 public String getContent(){ return sb.toString(); } /** * 開始標籤 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { sb.append("<"+qName); //判斷是否有屬性 if(attributes!=null){ for(int i=0;i<attributes.getLength();i++){ //得到屬性名稱 String attrName = attributes.getQName(i); //得到屬性值 String attrValue = attributes.getValue(i); sb.append(" "+attrName+"=\""+attrValue+"\""); } } sb.append(">"); } /** * 文字內容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { //得到當前讀取的文字 String content = new String(ch,start,length); sb.append(content); } /** * 結束標籤 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { sb.append("</"+qName+">"); } }
日誌輸出:
<contactList> <contact id="001"> <name>張三</name> <age>20</age> <phone>134222223333</phone> <email>[email protected]</email> <qq>432221111</qq> </contact> <contact id="002"> <name>李四</name> <age>20</age> <phone>134222225555</phone> <email>[email protected]</email> <qq>432222222</qq> </contact> </contactList>
import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * 使用sax解析把 xml文件封裝成物件 * @author APPle * */ public class Demo3 { public static void main(String[] args)throws Exception { SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); MyDefaultHandler3 handler = new MyDefaultHandler3(); parser.parse(new File("./src/contact.xml"), handler); List<Contact> list = handler.getList(); for (Contact contact : list) { System.out.println(contact); } } }
import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX處理程式 * @author APPle * */ public class MyDefaultHandler3 extends DefaultHandler { //儲存所有聯絡人物件 private List<Contact> list = new ArrayList<Contact>(); public List<Contact> getList(){ return list; } //儲存一個聯絡人資訊 private Contact contact; /** * 思路: * 1)建立Contact物件 * 2)把每個contact標籤內容存入到Contact物件 * 3)把Contact物件放入List中 */ //用於臨時儲存當前讀到的標籤名 private String curTag; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { curTag = qName; //讀取到contact的開始標籤建立Contact物件 if("contact".equals(qName)){ contact = new Contact(); //設定id值 contact.setId(attributes.getValue("id")); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { //當前文字內容 String content = new String(ch,start,length); if("name".equals(curTag)){ contact.setName(content); } if("age".equals(curTag)){ contact.setAge(content); } if("phone".equals(curTag)){ contact.setPhone(content); } if("email".equals(curTag)){ contact.setEmail(content); } if("qq".equals(curTag)){ contact.setQq(content); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //設定空時為了避免空格換行設定到物件的屬性中 curTag = null; //讀到contact的結束標籤放入List中 if("contact".equals(qName)){ list.add(contact); } } }
日誌輸出:
Contact [age=20, [email protected], id=001, name=張三, phone=134222223333, qq=432221111] Contact [age=20, [email protected], id=002, name=李四, phone=134222225555, qq=432222222]
Contact,xml
<?xml version="1.0" encoding="utf-8"?> <contactList> <contact id="001"> <name>張三</name> <age>20</age> <phone>134222223333</phone> <email>[email protected]</email> <qq>432221111</qq> </contact> <contact id="002"> <name>李四</name> <age>20</age> <phone>134222225555</phone> <email>[email protected]</email> <qq>432222222</qq> </contact> </contactList>
SAX解析原理: 載入一點,讀取一點,處理一點。對記憶體要求比較低
DOM解析原理:一次性把xml文件載入進記憶體,然後在記憶體中構建Document樹。 對記憶體要求比較要。 缺點: 不適合讀取大容量的xml檔案,容易導致記憶體溢位。
SAX解析工具- Sun公司提供的。內建在jdk中。org.xml.sax.*
核心的API:
SAXParser類: 用於讀取和解析xml檔案物件
parse(File f,
DefaultHandler dh
)方法: 解析xml檔案 引數一: File:表示 讀取的xml檔案。 引數二: DefaultHandler: SAX事件處理程式。使用DefaultHandler的子類
1.建立SAXParser物件 SAXParser parser=SAXParserFactory.newInstance().newSAXParser(); 2.呼叫parse方法 parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());} [一個類繼承class 類名(extends DefaultHandler) 在呼叫是建立傳進去 DefaultHandler類的API: void startDocument() : 在讀到文件開始時呼叫 void endDocument() :在讀到文件結束時呼叫 void startElement(String uri, String localName, String qName, Attributes attributes) :讀到開始標籤時呼叫 void endElement(String uri, String localName, String qName) :讀到結束標籤時呼叫 void characters(char[] ch, int start, int length) : 讀到文字內容時呼叫