国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java學習筆記SAX解析(6)

2019-11-14 23:21:04
字體:
來源:轉載
供稿:網友
java學習筆記SAX解析(6)

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。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深水埗区| 海安县| 朝阳区| 姜堰市| 五华县| 绥棱县| 施甸县| 汪清县| 垫江县| 龙井市| 抚远县| 中山市| 汉中市| 关岭| 民县| 金坛市| 综艺| 芦山县| 永兴县| 南召县| 和平县| 博客| 扎囊县| 额尔古纳市| 奎屯市| 东安县| 福海县| 东辽县| 红原县| 桃园县| 五原县| 抚宁县| 瓦房店市| 女性| 泽州县| 华安县| 祁东县| 滨海县| 基隆市| 大悟县| 杭锦后旗|