热血传奇官网新区
全國免費熱線:
XML的解析與生成
作者:中國IT實驗室 點擊:16875次 日期:2012-09-14
字號::T | T
歡迎進入Java社區論壇,與200萬技術人員互動交流 >>進入
    Android平臺上可以使用 Simple API for XML (SAX), Document Object Model(DOM) 和Android 附帶的pull解析器 解析XML文件
   
    眾所周知,DOM解析方式很耗內存, 優先使用SAX或者pull
   
    SAX:
   
    解析速度快,占用內存少,采用事件驅動,即不需要加載完整個文檔,而是按內容順序解析文檔,在此過程中,其會判斷當前讀到的內容是否符合XML語法定義,如果符合就會觸發事件,所謂事件,其實就是一些callback方法,具體方法含義比較簡單, 看文檔即可,定義在DefaultHandler接口中(SAX已內置到JDK5.0中)
   
    待解析xml文件musics.xml:
   
    xml version=“1.0” encoding=“utf-8”?>
   
   
   
    黑色幽默name>
   
    JayalbumName>
   
    2000year>
   
    music>
   
   
   
    愛在西元前name>
   
    范特西albumName>
   
    2001year>
   
    music>
   
   
   
    回到過去name>
   
    八度空間albumName>
   
    2002year>
   
    music>
   
   
   
    東風破name>
   
    葉惠美albumName>
   
    2003year>
   
    music>
   
   
   
    七里香name>
   
    七里香albumName>
   
    2004year>
   
    music>
   
   
   
    一路向北name>
   
    十一月的蕭邦albumName>
   
    2005year>
   
    music>musics>
   
    實體類MusicEntity就不貼了,四個屬性,上面的xml中也可以看出。
   
    實現了DefaultHandler接口的SaxHandler:
   
    public class SaxHandler extends DefaultHandler{
   
    private static final String TAG = “lanyan”;
   
    private List musics;
   
    private MusicEntity music;
   
    //緩存上一次的標簽名
   
    private String preTag;
   
    @Override
   
    public void startDocument() throws SAXException {
   
    musics = new ArrayList();
   
    }
   
    @Override
   
    public void startElement(String uri, String localName, String qName,
   
    Attributes attributes) throws SAXException {
   
    if (“music”.equals(localName)) {
   
    music = new MusicEntity();
   
    music.setId(Integer.parseInt(attributes.getValue(“id”)));
   
    }
   
    preTag = localName;
   
    }
   
    /**
   
    * 解析到文檔中字符內容時調用
   
    * 所以一般網絡中傳輸的xml,其父節點與子節點之間是緊挨在一起的,基本上就是一行,看起來很混亂,其實是為了避免解析時無必要的調用
   
    * 這里僅是測試,故忽略這個因素
   
    */
   
    @Override
   
    public void characters(char[] ch, int start, int length)
   
    throws SAXException {
   
    if (null != music) {
   
    String str = new String(ch, start, length);
   
    if (“name”.equals(preTag)) {
   
    music.setName(str);
   
    } else if (“albumName”.equals(preTag)) {
   
    music.setAlbumName(str);
   
    } else if (“year”.equals(preTag)) {
   
    music.setYear(Integer.parseInt(str));
   
    }
   
    }
   
    }
   
    @Override
   
    public void endElement(String uri, String localName, String qName)
   
    throws SAXException {
   
    if (“music”.equals(localName) && null != music) {
   
    musics.add(music);
   
    music = null;
   
    }
   
    preTag = null;
   
    }
   
    @Override
   
    public void endDocument() throws SAXException {
   
    }
   
    public List getMusics() {
   
    return musics;
   
    }
   
    }
   
    對外提供SAX解析服務的接口SaxService:
   
    public class SaxService {
   
    public static List readXml(InputStream is) throws Exception {
   
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
   
    SAXParser parser = saxFactory.newSAXParser();//
   
    parser.setProperty(“http://xml.org/sax/features/namespaces”, true);
   
    SaxHandler handler = new SaxHandler();
   
    parser.parse(is, handler);
   
    return handler.getMusics();
   
    }
   
    }


[1] [2] 下一頁

發表評論

昵稱 * 驗證碼 * 驗證碼
上一篇: >使用java編寫排序算法
下一篇: 常見JSP中文亂碼例子及其解決方法

資質證書

CMMI Ⅲ APPRAISAL ID:30062
ISO9001:08915Q20090ROS
ISO27001:04817I20037R0S
高新技術企業:GR201753000141
網站問題免費診斷

電子商務三位一體發展戰略

技術研發

業務培訓

實戰運營

戰略布局

热血传奇官网新区 电玩下载app领取38元彩金 亚洲兴发pt第一老虎机官网 时时彩代理刷返点技巧 南昌小姐信息 北京pk10最稳定玩法 云南时时十一选五开奖走势 北京单场比分直播 北斗彩票分析 新会员送88彩金 马云对众享云店的看法 非凡炸金花真人提现版 鹿鼎彩票网 Pt电子平台 华宝娱乐app