SAX即Simple Api for xml就是一個簡單的操作XML數據的一套SUN提供的API機制。
SAX采用的解析的原理是基于事件觸發的機制。
SAX技術只能進行XML數據的讀取。
1、準備需要解析的XML文件linkmans.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?><linkmans> <linkman> <name>jack</name> <phone>18663243245</phone> <email>jack@163.com</email> </linkman> <linkman> <name>張三</name> <phone>1353243247</phone> <email>zs@126.com</email> </linkman></linkmans>
2. 獲取SAX解析器// 2. 獲取SAX解析器 public static SAXParser getParser()throws Exception{ // 2.1 獲取解析器工廠類對象 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); return parser; }3. 解析數據// 3. 解析數據 public static void getElement(File file,DefaultHandler dh)throws Exception{ // 3.1獲取解析器 SAXParser parser = getParser(); // 3.2調用解析方法 parser.parse(file, dh); }4. 創建一個繼承自DefaultHandler類的MyHandler.javapublic class MyHandler extends DefaultHandler { // 當文檔開始解析的時候自動執行 public void startDocument() throws SAXException { super.startDocument(); System.out.5. 在main函數中調用解析元素的方法public static void main(String[] args)throws Exception { File file = new File("linkmans.xml"); MyHandler handler = new MyHandler(); getElement(file,handler); }通過以上的程序發現其實SAX解析的時候只是需要開發者傳遞相應的事件處理器對象即可(繼承自DefaultHandler的類)。
舉例1:創建一個事件處理器獲取XML中的指定的節點數據。public class OptionDataHandler extends DefaultHandler { // 定義一個成員變量記錄標簽的名 private String name = null; // 定義一個統計次數的變量 private int count = 0; // 遇到一個開始元素自動執行 public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { super.startElement(uri, localName, name, attributes); this.name = name; if("name".equals(this.name)){ this.count++; } } // 遇到文本內容自動執行 public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); // 判斷是否是name元素 if("name".equals(this.name) && this.count == 2){ System.out.println(new String(ch,start,length)); } }}案例一: 使用SAX解析XML數據并進行數據的集合封裝其實使用任何的XML解析技術來解析XML數據都需要后期的數據封裝,如果只是單獨的獲取某一個節點的值是沒有任何含義的。因此需要將XML的數據解析好之后以對象的方式進行封裝到指定的集合中便于其他應用程序的處理。
1. 實現一個Linkman.java的javabean對象public class Linkman { private String name; private String phone; private String email; public Linkman() { super(); } public Linkman(String name, String phone, String email) { super(); this.name = name; this.phone = phone; this.email = email; } // 省略get和set方法}3. 創建一個用于封裝的事件處理器Listhandler.javapublic class ListHandler extends DefaultHandler { // 定義javabean對象 private Linkman linkman = null; // 定義一個集合封裝javabean對象 private List<Linkman> list = null; // 定義解析的元素的名字 private String name = null; @Override public void startDocument() throws SAXException { super.startDocument(); // 創建list集合的對象 this.list = new ArrayList<Linkman>(); } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { super.startElement(uri, localName, name, attributes); // 記錄解析的元素的名 this.name = name; // 如果是linkman那么創建一個Linkman對象 if("linkman".equals(this.name)){ this.linkman = new Linkman(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); // 如果此時元素名是name獲取文本值 if("name".equals(this.name)){ this.linkman.setName(new String(ch,start,length)); } // 如果此時元素名是phone獲取文本值 if("phone".equals(this.name)){ this.linkman.setPhone(new String(ch,start,length)); } // 如果此時元素名是email獲取文本值 if("email".equals(this.name)){ this.linkman.setEmail(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String name) throws SAXException { super.endElement(uri, localName, name); // 釋放this.name this.name = null; // 如果此時的元素名是linkman if("linkman".equals(name)){ // 將linkman對象添加到集合 this.list.add(this.linkman); // 清空linkman對象 this.linkman = null; } } // 對外提供一個獲取封裝好linkman集合的方法 public List<Linkman> getList() { return list; }}總結:如果使用SAX進行數據的讀取那么一定是一個很好的選擇,但是該解析技術不能進行其他的操作比如:增、刪和改。
解決方案:可以有一個種技術獎DOM和SAX結合起來即可以高效的查詢又可以進行實際的數據操作(增、刪和改)。即使用第三方的XML解析技術DOM4J。
新聞熱點
疑難解答