亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中使用sax解析xml文件的方法

2020-04-11 12:27:10
字體:
來源:轉載
供稿:網友

SAX是一個解析速度快并且占用內存少的xml解析器,非常適合用于Android等移動設備。 SAX解析XML文件采用的是事件驅動,也就是說,它并不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字符是否合法XML 語法中的某部分,如果符合就會觸發事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法:

startDocument():當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。

endDocument():和上面的方法相對應,當文檔結束的時候,調用這個方法,可以在其中做一些善后的工作。

startElement(String namespaceURI, String localName, String qName, Attributes atts)

當讀到一個開始標簽的時候,會觸發這個方法。 namespaceURI就是命名空間,localName是不帶命名空間前綴的標簽名,qName是帶命名空間前綴的標簽名。通過atts可以得到所有的屬性名和相應的值。要注意的是SAX中一個重要的特點就是它的流式處理,當遇到一個標簽的時候,它并不會紀錄下以前所碰到的標簽,也就是說,在 startElement()方法中,所有你所知道的信息,就是標簽的名字和屬性,至于標簽的嵌套結構,上層標簽的名字,是否有子元屬等等其它與結構相關的信息,都是不得而知的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM來得那么方便。

endElement(String uri, String localName, String name):這個方法和上面的方法相對應,在遇到結束標簽的時候,調用這個方法。

characters(char[] ch, int start, int length) :這個方法用來處理在XML文件中讀到的內容,第一個參數為文件的字符串內容,后面兩個參數是讀到的字符串在這個數組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內容。

注意:一個標簽之間的字符比較多時,或者字符串中包含有”/n”等特殊字符時,就會出現字符丟失的現象。遇到這種問題不要懷疑SAX不能解析標簽中含有”/n”或字符比較多的XML。實際上是我們寫的Handler是有問題的。SAX在解析XML時,當遇到一個標簽中的內容比較多時,就會多次調用characters。所以我們在寫Handler時要考慮到這種情況。就不會丟字符了。以下是一種解決方案:新建一個臨時變量temp,在調用characters方法中用temp接收數據,在endElement方法中把臨時變量temp賦值給目標變量,并給臨時變量temp清空,避免出現臟數據,這樣就可以解決sax讀取XML時不能讀取換行符號后面的內容的問題。

ljq.xml 文件

復制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="23">
        <name>李明</name>
        <age>30</age>
    </person>
    <person id="20">
        <name>李向梅</name>
        <age>25</age>
    </person>
</persons>

實體類
復制代碼 代碼如下:

package com.ljq.entity;

import java.io.Serializable;

/**
 * 實體類
 *
 * @author jiqinlin
 *
 */
@SuppressWarnings("serial")
public class Person implements Serializable{
    private Integer id;
    private String name;
    private Short age;

    public Person() {
    }

    public Person(String name, Short age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }

}


handle類
復制代碼 代碼如下:

package com.ljq.service;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.ljq.entity.Person;


public class XMLContentHandler extends DefaultHandler {
    //臨時變量,解決sax讀取XML時不能讀取換行符號后面的內容的問題;注意temp=""不能寫成temp或temp=null,避免臟數據
    private String temp="";
    private String preTag;
    private Person person;
    private List<Person> persons;

    @Override
    public void startDocument() throws SAXException {
        persons = new ArrayList<Person>();
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (person!=null){
            String date = new String(ch,start,length);
            if ("name".equals(preTag)) {
                temp+=date;
            }else if ("age".equals(preTag)) {
                temp+=date;
            }
        }
    }

    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        if ("person".equals(localName)) {
            person= new Person();
            person.setId(attributes.getIndex("id"));
        }
        preTag = localName;
    }

    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        if (person !=null && "name".equals(localName)) {
            person.setName(temp);
            temp="";
        }else if (person !=null && "age".equals(localName)) {
            person.setAge(new Short(temp));
            temp="";
        }else if (person !=null && "person".equals(localName)) {
            persons.add(person);
            person = null;
        }
        preTag = null;
    }

    //getter...
    public List<Person> getPersons() {
        return persons;
    }

}


復制代碼 代碼如下:

package com.ljq.service;

import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.ljq.entity.Person;

/**
 * sax解析工廠
 *
 * @author jiqinlin
 *
 */
public class SaxPersonService {
    // 業務層要對外拋出
    public static List<Person> readXML(InputStream inStream) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser saxParser = spf.newSAXParser(); // 創建解析器
        // 設置解析器的相關特性,http://xml.org/sax/features/namespaces = true
        // 表示開啟命名空間特性
        // saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
        XMLContentHandler handler = new XMLContentHandler();
        saxParser.parse(inStream, handler);
        inStream.close();
        return handler.getPersons();
    }

}


測試類
復制代碼 代碼如下:

package com.ljq.test;

import java.io.InputStream;
import java.util.List;

import com.ljq.entity.Person;
import com.ljq.service.SaxPersonService;

import android.test.AndroidTestCase;
import android.util.Log;

public class SaxPersonServiceTest extends AndroidTestCase{
    private final String TAG = "SaxPersonServiceTest";
    public void testReadXML() throws Exception{
        //ljq.xml放在src目錄下
        InputStream inputStream = SaxPersonServiceTest.class.getClassLoader().getResourceAsStream("ljq.xml");
        List<Person> persons = SaxPersonService.readXML(inputStream);
        for(Person person : persons){
           Log.i(TAG, person.getId() + " : " + person.getName() + " : " + person.getAge());
        }
    }
}



運行結果

在android模擬器中,如果是中文字符會出現亂碼,在真機上就不會出現這種情況

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩毛片在线观看| 欧美激情网站在线观看| 欧美日本啪啪无遮挡网站| 国产精品吹潮在线观看| 欧美美最猛性xxxxxx| 超碰日本道色综合久久综合| 亚洲欧洲自拍偷拍| 国产成人精品一区二区在线| 国产精品亚洲综合天堂夜夜| 欧美在线免费观看| 国产噜噜噜噜久久久久久久久| 国产精品久久久久影院日本| 丝袜亚洲欧美日韩综合| 国产精品第3页| 中文字幕精品—区二区| 久久精品99无色码中文字幕| 欧美成人免费网| 这里只有精品久久| 日韩一区二区精品视频| 国产伦精品一区二区三区精品视频| 欧美在线视频在线播放完整版免费观看| 亚洲国产精品久久久| 亚洲综合最新在线| 亚洲新声在线观看| 亚洲人成伊人成综合网久久久| 亚洲第一区第一页| 久久久久久成人| 精品二区三区线观看| 国产日韩av在线播放| 欧美精品制服第一页| 在线播放日韩av| 日本伊人精品一区二区三区介绍| 欧美激情一级精品国产| 性色av香蕉一区二区| 亚洲精品一区二三区不卡| 国产香蕉精品视频一区二区三区| 尤物精品国产第一福利三区| 久久不射热爱视频精品| 国产精品99蜜臀久久不卡二区| 亚洲高清免费观看高清完整版| 国产在线999| 久久777国产线看观看精品| 91热福利电影| 国产成人精品日本亚洲专区61| 最近中文字幕日韩精品| 欧美激情按摩在线| 国产va免费精品高清在线| 久久久91精品| 孩xxxx性bbbb欧美| 久久躁日日躁aaaaxxxx| 欧美贵妇videos办公室| 亚洲人成电影网站色www| 欧美激情在线观看| 欧美大尺度在线观看| 黄色成人在线播放| 久久99久久99精品免观看粉嫩| 深夜精品寂寞黄网站在线观看| 亚洲一级黄色片| 热久久美女精品天天吊色| 日韩hd视频在线观看| 26uuu另类亚洲欧美日本老年| 色琪琪综合男人的天堂aⅴ视频| 国产精品久久久久久久久久小说| 成人性教育视频在线观看| 精品中文视频在线| 国产精品一区二区三区在线播放| 国产视频综合在线| 亚洲国产成人在线视频| 国产精品视频永久免费播放| 91精品国产色综合| 亚洲自拍在线观看| 日韩性xxxx爱| 综合网中文字幕| 亚洲高清在线观看| 色诱女教师一区二区三区| 成人免费视频a| 精品国产依人香蕉在线精品| 国语自产精品视频在线看一大j8| 久久久久久久久久久国产| 久久精品中文字幕一区| 精品久久久久久中文字幕| 欧美美女18p| 在线国产精品播放| 久久香蕉频线观| 最近的2019中文字幕免费一页| 欧美午夜无遮挡| 欧美色播在线播放| 日韩免费在线视频| 在线播放亚洲激情| 国产成人精彩在线视频九色| 国产精品www| 亚洲欧洲一区二区三区在线观看| 亚洲色图色老头| 26uuu另类亚洲欧美日本一| 91在线中文字幕| 日韩午夜在线视频| 日韩美女中文字幕| 一区二区亚洲欧洲国产日韩| 亚洲国产福利在线| 日韩精品亚洲元码| 欧美日韩在线观看视频小说| 日韩最新中文字幕电影免费看| 日韩美女视频在线观看| 日韩电影第一页| 北条麻妃一区二区三区中文字幕| 91精品国产高清久久久久久久久| 色综合久综合久久综合久鬼88| 欧美激情乱人伦一区| 92国产精品久久久久首页| 久久久爽爽爽美女图片| 日韩视频免费在线| 91av在线视频观看| 日韩av免费在线看| 精品无人区乱码1区2区3区在线| 午夜精品福利在线观看| 亚洲福利视频网站| 欧美日韩激情网| 上原亚衣av一区二区三区| 国产69精品久久久久9999| 中文字幕日本精品| 国产精品一区二区久久久久| 精品国产乱码久久久久久虫虫漫画| 欧美美最猛性xxxxxx| 日韩欧美在线字幕| 亚洲深夜福利在线| 日本中文字幕久久看| 久久精品2019中文字幕| 91精品国产91久久久久福利| 最好看的2019年中文视频| 亚洲欧美999| 欧洲s码亚洲m码精品一区| 亚洲国产欧美日韩精品| 国产亚洲激情视频在线| 久久久久久久久久久免费精品| 久久久女人电视剧免费播放下载| 欧美极品少妇xxxxⅹ裸体艺术| 国产成人精品免费久久久久| 亚洲激情在线视频| 久久国内精品一国内精品| 亚洲男人第一av网站| 91免费看片在线| 成人免费视频网址| 国产精品福利无圣光在线一区| 欧美在线视频免费观看| 午夜欧美不卡精品aaaaa| 久久夜色精品亚洲噜噜国产mv| 午夜精品视频在线| 国内偷自视频区视频综合| 97视频免费在线观看| 欧美尤物巨大精品爽| 欧美专区福利在线| 国产这里只有精品| 日韩av电影在线播放| 国产精品欧美日韩久久| 亚洲精品98久久久久久中文字幕| 欧美最猛性xxxxx免费| 色视频www在线播放国产成人| 伊人男人综合视频网| 国产精品久久久久77777| 日韩在线观看免费全集电视剧网站| 亚洲三级av在线| 亚洲欧美日本另类| 国产精品扒开腿做爽爽爽的视频| 久久久www成人免费精品|