Xml解析總結-DOM-SAX-Pull

1.Xml解析方式-DOM,SAX,Pull

1.DOM解析(Document Object Model)
    起源: W3C組織(world wide web)
    原理: 將整個XML文檔加載到內存中,以樹形結構形式存在(封裝成DOM對象樹);
    特點: 耗內存,但能對xml增刪改查,能讀取任意位置數據(回讀),用于小XML文件
    
    DOM對象
        Document  整個文檔(HTML,XML)
        Element   標簽元素
        Attribute 標簽屬性
        Text      標簽內的文本
        Common    注釋
        
    瀏覽器解析Html,也是采取DOM解析!

2.SAX解析(Simple API for XML)
    起源: 社區論壇
    原理: 基于事件驅動的流式解析(XML數據流,邊讀邊解),讀到一個文檔事件就通知處理,處理完就釋放內存,繼續下一個事件
    特點: 省內存, 但只能順序讀取xml(不能回讀),無法修改,用于大XML文件
    
    XML事件       
        startDocument (START_DOCUMENT) 文檔開始事件
        endDocument (END_DOCUMENT)     文檔結束事件
        startElement (START_TAG)       元素/標簽開始事件
        endElement (END_TAG)           元素/標簽結束事件
        character (TEXT)               文本事件

3.Pull解析
    類似SAX,也是基于事件驅動,適用于移動平臺,Android默認采用該解析方式(XmlPullParser)
    SAX解析: 自動觸發事件,不解析完整個文檔就不會結束解析
        (說白了就是框架自動讀取觸發事件,通過回調通知程序員,沒有主動權,只能被迫解析完整個文檔)
        
    Pull解析: 手動觸發事件,可以中途結束解析
        (說白了就是程序員主動觸發文檔事件自己處理,把主動權交給我們自己,更靈活,可中途結束解析)

2.XML解析庫-Java框架

1.JAXP

JAXP是JDK自帶的XML解析庫,同時支持SAX/DOM兩種解析方式
常用類庫包名:
    SAX:   org.xml.sax
    DOM:   org.w3c.dom
    JAXP:  javax.xml.parsers

// SAX解析, 創建SAX解析器, 注冊文檔事件==================================================================================
SAXParserFactory.newInstance().newSAXParser().parse("XML文件", new MyContentHandler());
class MyContentHandler extends DefaultHandler{ // 事件處理器,被動觸發,回調通知
    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes){
        // 元素開始事件
    }
    
    @Override
    public void characters(char[] ch, int start, int length){
        // 文本事件
    }
    
    @Override
    public void endElement(String uri, String localName, String name){
        // 元素結束事件
    }
}

// DOM解析, 創建DOM解析器, 獲取Document對象=================================================================================================
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("xml文件");
// 利用Document Element Attribute等類, 對XML增刪改查
  

2.Dom4j

Dom4j是由早期開發JDOM的人分離出來而后獨立開發,比JDOM性能更好
Dom4j對Xml文檔增刪改查更方便, 很多商用軟件都采用Dom4j, 例如Hibernate, JAXM 

// 元素增刪改查
public void element() throws Exception{
    Document document = new SAXReader().read("xml文件");
    Element rootElement = document.getRootElement();
    
    // 查詢元素
    rootElement.element("元素名").getText();
    
    // 增加元素 
    rootElement.element("元素名").add(DocumentHelper.createElement("元素名"));
    rootElement.element("元素名").addElement("元素名");
    
    // 修改元素名和內容
    rootElement.element("元素名").setText("元素內容");
    rootElement.element("元素名").setName("元素名");
    
    // 刪除元素
    Element element = rootElement.element("元素名");
    element.getParent().remove(element);
    
    // 輸出到Xml文件
    XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
    writer.write(document);
    writer.close();     
}

// 屬性增刪改查
public void attr() throws Exception{    
    Document document = new SAXReader().read("xml文件");
    Element rootElement = document.getRootElement();
            
    // 查詢屬性
    rootElement.element("元素名").attributeValue("屬性名");
    
    // 增加/修改屬性
    rootElement.element("元素名").addAttribute("屬性名", "屬性值");
    
    // 刪除屬性
    Attribute attr = rootElement.element("元素名").attribute("出版社");
    attr.getParent().remove(attr);
    
    // 輸出到Xml文件
    XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
    writer.write(document);
    writer.close();
}

3.XmlPullParser(Android自帶的Pull解析類庫)


// XmlPullParser常用方法
public void setInput (InputStream inputStream, String inputEncoding); // 設置XML文件輸入流
public int getEventType (); // 獲取當前事件類型
public int next ();         // 手動觸發下一個事件
public String getName();    // 獲取標簽名
public String getAttributeValue (int index);// 獲取屬性值
public String nextText ();  // 當前是開始標簽, 若下個元素為文本,則返回文本; 若是結束標簽,則返回空字符串; 其它情況將拋出異常

// 創建XML解析器
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new FileInputStream("xml文件"), encode);

// 手動循環觸發事件,解析XML
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) { // 文檔結束事件
    switch (eventType) {
    case XmlPullParser.START_DOCUMENT: // 文檔開始事件        
        break;
    case XmlPullParser.START_TAG:      // 標簽開始事件
        String tagName = parser.getName().trim();    // 標簽名
        String attr = parser.getAttributeValue(...); // 屬性值 
        String name = parser.nextText().trim();      // 標簽內部文本      
        break;
    case XmlPullParser.END_TAG:        // 標簽結束事件    
        break;
    }
    eventType = parser.next(); // 手動觸發下一個事件
}

簡書: http://www.lxweimin.com/p/dfe369dce44d
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54236641
GitHub博客:http://lioil.win/2017/01/08/Xml-DOM-SAX.html
Coding博客:http://c.lioil.win/2017/01/08/Xml-DOM-SAX.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. XML總結 1.1. XML簡介 XML : 可擴展的標記語言。(和HTML非常類似的) 可擴展的。 自定義...
    Ethan_Walker閱讀 3,117評論 0 12
  • 眾所周知,SAX與DOM是JAVA中兩大核心XML解析API類庫,而JAXP,JDOM與DOM4J都是基于這兩大核...
    熊頎閱讀 988評論 2 5
  • 一、DOM解析XML 我們首先來看看DOM(Document Object Model)這種方式解析xml,通過D...
    小董666閱讀 355評論 0 1
  • 那年我17,因為打群架被開除,其實說不上是因為什么事,那時候就是覺得好玩,有面,剛好就是流行非主流的時代。每次看著...
    蒼白的對白閱讀 295評論 0 0
  • 一、什么是Apple Pay? 概念 Apple Pay,簡單來說, 就是一種移動支付方式。通過Touch ID/...
    Jack_Baiyx閱讀 12,082評論 0 3