XML文檔解析幾種方式

解析XML文檔的三種方式:dom解析,sax解析,pull解析。

dom解析

概述:全稱document object model(文檔對象模型) 文檔:指的是標記型文檔(html、xml);對象:在對象裏面有屬性和方法;使用dom裏面提供的對象裏面的屬性和方法,對標記型文檔進行操作。dom解析常用於JavaWeb中的xml文檔解析。

dom解析優缺點:

  • 優點:根據xml文檔的結構,在內存中分配了一個樹形結構,因爲是樹形結構,很方便增加,修改,刪除的操作。
  • 缺點:如果解析的文檔過大,一次性在內存中分配一個樹形結構,容易造成內存溢出。

sax解析

概述:全稱Simple API for XML,既是一種接口,也是一種軟件包。它是一種XML解析的替代方法。SAX不同於DOM解析,它逐行掃描文檔,一邊掃描一邊解析,當讀到特定的標籤時候,自動調用相應的方法進行操作。由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中,這對於大型文檔的解析是個巨大優勢。sax解析用於android中的xml文檔解析。

sax解析優缺點:

  • 優點:由於解析方式是邊讀邊解析,不會造成內存的溢出。
  • 缺點:不能實現增加,修改,刪除的操作。

pull解析

概述:pull解析和sax解析的原理一樣,pull解析xml文件把xml中的內容放到集合裏面。不一樣的是pullpull讀取xml文件後調用方法返回的是數字:

讀取到xml的聲明返回數字0 START_DOCUMENT;
讀取到xml的結束返回數字1 END_DOCUMENT
讀取到xml的開始標籤返回數字2 START_TAG
讀取到xml的結束標籤返回數字3 END_TAG
讀取到xml的文本返回數字4 TEXT

pull解析常用於Android中的xml文件解析。也可脫離Android獨自使用,由於我是搞Android開發的,這個就寫的詳細一點了。

代碼:

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1">
        <name>張三</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="2">
        <name>李四</name>
        <sex></sex>
        <age>20</age>
    </student>
</root>

PullPerson.java

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class PullPerson {

    /**
     * @author Listener_Gao
     * @param args
     */
    public static void main(String[] args) {
        //person.xml文檔在項目的src目錄下
        String path = "src/person.xml";
        List<Person> list = null;
        try {
            list = pullParserXml(path);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //遍歷集合
        for (Person p : list) {
            System.out.println(p);
        }

    }
    /**
     * pull解析person.xml文件,把解析到的文件放到集合中
     * @return List<Person> 返回list集合
     * @param  filePath   xml文件的路徑  
     */
    public static List<Person> pullParserXml(String filePath) throws Exception {

        //創建解析器工廠 對象
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //使用解析器工廠對象  創建解析器
        XmlPullParser parser = factory.newPullParser();
        //把要操作的文件放到解析器中
        parser.setInput(new FileInputStream(filePath), "utf-8");

        /***************************開始解析xml文檔************************/
        List<Person> list = null;
        Person p = null;
        //獲取標籤的類型
        int typeEvent = 0; //parser.getEventType();
        //如果沒有讀到結束的標籤就一直循環
        while((typeEvent = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
            //得到當前解析到的標籤的名稱
            String tagName = parser.getName();
            /**
             * 1,解析到root,創建list集合
             * 2,解析到student,創建Person對象
             * 3,解析到name,sex,age內容是,過去標籤的內容
             * 4,將標籤的內容添加到person對象中
             */
            switch(typeEvent) {
            case XmlPullParser.START_TAG:
                if("root".equals(tagName)) {
                    //解析到root,創建list集合
                    list = new ArrayList<>();
                }else if("student".equals(tagName)) {
                    //解析到student,創建Person對象
                    p = new Person();
                    //讀取student標籤中的id屬性
                    int id = Integer.parseInt(parser.getAttributeValue(0));
                    //將id的值放到person對象中
                    p.setId(id);
                    //簡寫成一步
                    //p.setId(Integer.parseInt(parser.getAttributeValue(0)));
                }else if ("name".equals(tagName)) {
                    //得到標籤的值
                    String name = parser.nextText();
                    //將得到的name的值放person對象中
                    p.setName(name);
                }else if ("sex".equals(tagName)) {
                    p.setSex(parser.nextText());
                }else if ("age".equals(tagName)) {
                    p.setAge(Integer.parseInt(parser.nextText()));
                }
                break;

            case XmlPullParser.END_TAG:
                //當解析到結束標籤的root時,將對象添加到list集合中
                if("student".equals(tagName)) {
                    list.add(p);
                    //p = null;
                }
                break;
            }
            //繼續執行
            parser.next();
        }
        return list;
    }
}
發佈了28 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章