XML解析

三種常見的解析方式:
1、JAXP DOM 解析
2、JAXP SAX 解析
3、XML PULL 進行 STAX 解析

XML 技術主要企業應用
1、存儲和傳輸數據
2、作爲框架的配置文件

使用xml 存儲和傳輸數據
1、通過程序生成xml
2、讀取xml 中數據 —- xml 解析

什麼是DOM和SAX ?
DOM Document Object Model —– 文檔對象模型
DOM思想: 將整個xml 加載內存中,形成文檔對象,所有對xml操作都對內存中文檔對象進行
DOM 是官方xml解析標準
* 所有開發語言都支持的

Java、JavaScript 都支持DOM

SAX Simple API for XML —– XML 簡單 API
程序員爲什麼發明sax解析方式?? 當xml 文檔非常大,不可能將xml所有數據加載到內存
SAX 思想:一邊解析 ,一邊處理,一邊釋放內存資源 —- 不允許在內存中保留大規模xml 數據

StAX The Stream API for XML —– XML 流 API
STAX 是一種 拉模式 xml 解析方式,SAX 是一種 推模式 XML 解析方式

推push模式:由服務器爲主導,向客戶端主動發送數據
拉pull模式: 由客戶端爲主導,主動向服務器申請數據

程序員在實際開發中,使用已經開發好工具包 —– JAXP 、DOM4j 、XML PULL

解析方式 與 解析開發包 關係?
解析方式是解析xml 思想,沒有具體代碼,解析開發包是解析xml思想具體代碼實現

JAXP 是sun官方推出實現技術 同時支持 DOM SAX STAX
DOM4j 是開源社區開源框架 支持 DOM 解析方式
XML PULL Android 移動設備內置xml 解析技術 支持 STAX 解析方式

當SAX和STAX 讀取xml數據時,如果讀取到內存數據不釋放 —– 內存中將存在整個xml文檔數據 (類似DOM 支持修改和回寫)

DOM、SAX、STAX 在實際開發中選擇?
在javaee日常開發中 —- 優先使用DOM (編程簡單)
當xml 文檔數據非常多,不可能使用DOM —造成內存溢出 —— 優先使用STAX
移動開發 使用 STAX —- Android XML PULL

JAXP 開發 進行 xml解析 :
javax.xml.parsers 存放 DOM 和 SAX 解析器
javax.xml.stream 存放 STAX 解析相關類
org.w3c.dom 存放DOM解析時 數據節點類
org.xml.sax 存放SAX解析相關工具類

DOM 解析快速入門
1、創建 xml 文檔 books.xml
在企業實際開發中,爲了簡化xml 生成和解析 —- xml 數據文件通常不使用約束的
2、使用DOM解析xml
將整個xml文檔加載到內存中 : 工廠 — 解析器 — 解析加載
3、Document通過 getElementsByTagName 獲得 節點集合 NodeList
通過 NodeList 提供 getLength 和 item 遍歷 節點集合

遍歷ArrayList
for (int i=0;i

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
    <!ELEMENT books (book+) >
    <!ELEMENT book (name,price) >
    <!ELEMENT name (#PCDATA) >
    <!ELEMENT price (#PCDATA) >
    <!ATTLIST book
       id ID #REQUIRED 
    >
]>
<books>
    <book id="b001">
        <name>java編程基礎</name>
        <price>80</price>
    </book>
    <book id="b002">
        <name>java高級應用</name>
        <price>100</price>
    </book>
    <book id="boo3">
        <name>編程高手祕笈</name>
        <price>200</price>
    </book> 
</books>

Pull上課解析代碼

package cn.itcast.stax.pull;

import java.io.FileInputStream;

import org.junit.Test;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

/**
 * 通過 pull 解析器 解析 xml
 * 
 * @author seawind
 * 
 */
public class PullTest {
    @Test
    // 通過 pull 解析技術 查看 "編程高手祕笈" 價格
    public void demo2() throws Exception {
        // 1. 創建 pull 解析器
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();
        // 2. 將 xml文檔傳遞 解析器
        parser.setInput(new FileInputStream("books.xml"), "utf-8");

        // 通過循環 驅動事件解析
        int event;

        // 查找name 標識位
        boolean isFound = false;
        while ((event = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
            // 獲得 開始元素 name
            if (event == XmlPullParser.START_TAG
                    && parser.getName().equals("name")) {
                // 獲得元素後面文本
                String bookname = parser.nextText();
                if (bookname.equals("編程高手祕笈")) {
                    isFound = true;
                    // 這本書就是我找到
                    // parser.next();
                    // System.out.println(parser.getEventType());
                    // parser.next(); // price 開始
                    // System.out.println(parser.getEventType());
                    // String money = parser.nextText();
                    // System.out.println(money);
                }
            }

            if (event == XmlPullParser.START_TAG
                    && parser.getName().equals("price") && isFound) {
                System.out.println(parser.nextText());
                break;
            }

            parser.next();
        }
    }

    @Test
    public void demo1() throws Exception {
        // 1、創建 xml pull 解析器
        // 工廠
        XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory
                .newInstance();

        // 通過工廠 獲得解析器
        XmlPullParser parser = xmlPullParserFactory.newPullParser();

        // 2、將 xml 文件 傳遞 解析器
        parser.setInput(new FileInputStream("books.xml"), "utf-8");

        // pull 解析器用得是 拉模式 數據 解析
        int event;

        while ((event = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
            // 打印哪個元素開始了 ---- 判斷當前事件 是 元素開始事件
            if (event == XmlPullParser.START_TAG) {
                // 所有數據 從解析器 獲得
                System.out.println(parser.getName() + "元素開始了...");
            }

            // 打印 哪個 元素 結束了
            if (event == XmlPullParser.END_TAG) {
                System.out.println(parser.getName() + "元素 結束了...");
            }

            // 處理下一個事件
            parser.next();
        }

        // // 獲得當前事件 類型
        // int event = parser.getEventType();
        //
        // System.out.println(event);
        //
        // parser.next(); // 解析器解析下一個事件
        //
        // int event2 = parser.getEventType();
        //
        // System.out.println(event2);
        //
        // parser.next();
        //
        // int event3 = parser.getEventType();
        //
        // System.out.println(event3);

    }
}

生成pull筆記
創建的xml文件

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<companies>
    <company>
        <name>傳智播客</name>
        <pnum>200</pnum>
        <address>西二旗軟件園!</address>
    </company>
    <company>
        <name>CSDN</name>
        <pnum>1000</pnum>
        <address>西二旗 軟件園 </address>
    </company>
</companies>

增刪改查xml內容

package cn.itcast.stax.pull;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import cn.itcast.domain.Company;

/**
 * 完成pull解析器CURD操作
 * 
 * @author seawind
 * 
 */
public class PullCURD {
    @Test
    // 將xml中數據 ---- List集合對象
    public void demo1() throws Exception {
        List<Company> companies = new ArrayList<Company>();
        Company company = null;

        // 獲得解析器
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();

        // 向解析器傳入xml文件
        parser.setInput(new FileInputStream("company.xml"), "utf-8");

        // 遍歷解析
        int event;
        while ((event = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {

            if (event == XmlPullParser.START_TAG
                    && parser.getName().equals("company")) {
                // company 開始 創建 company 對象
                company = new Company();
            }

            if (event == XmlPullParser.START_TAG
                    && parser.getName().equals("name")) {
                // name 元素開始 -- 封裝name屬性
                company.setName(parser.nextText());
            }

            if (event == XmlPullParser.START_TAG
                    && parser.getName().equals("pnum")) {
                company.setPnum(Integer.parseInt(parser.nextText()));
            }

            if (event == XmlPullParser.START_TAG
                    && parser.getName().equals("address")) {
                company.setAddress(parser.nextText());
            }

            if (event == XmlPullParser.END_TAG
                    && parser.getName().equals("company")) {
                // company 結束
                companies.add(company);
            }

            parser.next();
        }

        for (Company c : companies) {
            System.out.println(c.getName());
            System.out.println(c.getPnum());
            System.out.println(c.getAddress());
            System.out.println("----------------------");
        }

    }
}
發佈了46 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章