XML——XML解析介紹

解析思想
解析: 讀取xml.將xml中記錄 的數據提取.

DOM Document Object Model 文檔對象模型

DOM思想是由W3C組織(world wide web)發佈的.
核心思想: 把文檔中所有內容都 封裝成對象.
對象種類:
Document 整個(HTML,XML)文檔
Element  文檔中每一個標籤都會被封裝成Element對象
Attribute 標籤上的每一個屬性都會被封裝成Attribute
Text      文檔中,標籤內的文本都會封裝成Text對象
Common   註釋,文檔中的註釋 ,會被封裝成common.

Dom的優勢:
將文檔結構(所有內容)都以對象的形式保留在了內存中.我們可以對內存中的(Dom樹)進行增刪改查操作,並且操作很方便.

Dom的劣勢:
因爲保留了全部文檔內容,資源消耗比較大.

SAX解析思想
出身: 出身於國外論壇.

解析原理: 事件驅動.
優點: 在讀取xml文檔時, 已經根據定義好的事件,對xml內容進行了篩選.解析完成後,
內存中只保留了我們想要的內容.比較節約資源. 在資源比較匱乏的平臺使用.
缺點: 沒有保留文檔的結構. 無法進行增刪改的操作.

sax中的事件:

文檔開始事件: startDocument
文檔結束事件: endDocument
元素開始事件: startElement
元素結束事件: endElement
文本事件:character

Pull解析
與Sax一樣.都屬於事件驅動的解析方式.
相比Sax解析過程更加靈活.
sax一旦開始解析就是從頭讀到尾.不解析完整個文檔不會停
pull解析較爲靈活.是以事件爲單位.手動向下繼續. 如果獲得到我們要找的內容. 可以停止繼續解析.

要解析的stu.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student number="panpan_0001" >
        <name>tom</name>
        <sex>male</sex>
        <age>18</age>
    </student>
    <student number="panpan_0002" >
        <name>jerry</name>
        <sex>male</sex>
        <age>16</age>
    </student>
</students>

解析的代碼:
實體類部分

package cn.wonders.bean;

public class Student {
    private String number;
    private String name;
    private String sex;
    private int age;
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "Student[number="+number+",name="+name+",sex="+sex
        +",age="+age+"]";
    }
}

解析部分:

public class PullTool {
    //使用Pull解析
    public static List<Student>parseXml(InputStream is)throws Exception{
        List<Student>list = null;
        Student stu =null;
        //1.創建解析器工廠
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

        //2.使用工廠獲得解析器
        XmlPullParser parser = factory.newPullParser();

        //3.使用解析器讀取xml流
        parser.setInput(is, "UTF-8");

        //4.獲得當前事件的狀態
        int type =parser.getEventType();

        //  返回類型START_DOCUMENT,END_DOCUMENT,START_TAG,END_TAG,TEXT
        while(type!=XmlPullParser.END_DOCUMENT){
            switch (type) {
            case XmlPullParser.START_TAG:
                //判斷當前遇到的元素名稱是否爲students
                if ("students".equals(parser.getName())) {
                    list = new ArrayList<Student>();
                }else if ("student".equals(parser.getName())) {
                    //初始化Student對象
                    stu = new Student();
                    //讀取number屬性
                    String number = parser.getAttributeValue(null, "number");
                    stu.setNumber(number);  

                }else if ("name".equals(parser.getName())) {
                    String name = parser.nextText();
                    stu.setName(name);                  
                }else if("sex".equals(parser.getName())){
                    String sex =  parser.nextText();
                    stu.setSex(sex);
                }else if("age".equals(parser.getName())){
                    int  age =  Integer.parseInt(parser.nextText());
                    stu.setAge(age);
                }
                break;

            case XmlPullParser.END_TAG:
                if ("student".equals(parser.getName())) {
                    list.add(stu);
                    stu = null;
                }
                break;

            default:
                break;
            }
            type = parser.next();
        }
        return list;
    }
    public static void main(String[]args)throws Exception{
        FileInputStream is = new FileInputStream("src/stu.xml");
        List<Student>list = PullTool.parseXml(is);
        System.out.println(list);
        is.close();
    }
}

pull解析的jar包下載:
http://download.csdn.net/detail/panpan_1994/9607155

解析的結果爲:
[Student[number=panpan_0001,name=tom,sex=male,age=18], Student[number=panpan_0002,name=jerry,sex=male,age=16]]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章