1. 程式人生 > >xml中三種解析方式介紹

xml中三種解析方式介紹

1)dom: 文件物件模型(Document Object Model) 官方推薦的標準

 dom原理:會把我們要解析的整個xml載入到到記憶體中.在記憶體中形成一個樹形結構
 優點:可以進行增刪改查
 缺點:由於把整個文件載入到記憶體中.所以會造成記憶體洩露 

2)sax: 簡單應用程式介面(Simple Api For Xml) 他不是官方推薦 是一個程式設計師社群研究出來

 特點:一邊解析 一邊處理 一邊釋放記憶體  
 優點:不會有記憶體洩露 
 缺點: 不能進行增 刪 改

3)xmlpull解析:他是Android中內建的解析器,解析原理類似sax

1、dom解析實現

dom sax xmlpull只是三種解析的方式 或者說是解析的思想,他並沒有提供相應的api實現
sun公司提供了一套介面jaxp Java API for XML Processing 實現了dom 和 sax解析
dom解析會形成一個樹形結構 
dom解析把xml元素 屬性 文字都當成是節點(node)
實現思路:通過工廠獲取解析器的例項  拿到解析器的例項後解析xml  
具體實現步驟:
    //[1]定義工廠
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    //[2]通過工廠獲取解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //[3]開始解析xml document代表整棵樹 Document document = documentBuilder.parse("bookstore.xml"); //[4]獲取我們想獲取的內容 NodeList elementsByTagNames = document.getElementsByTagName("name"); //[5]迴圈取出集合中每個節點
for(int i=0;i<elementsByTagNames.getLength();i++){ //[6]取出每個item5. Node item = elementsByTagNames.item(i); String content = item.getFirstChild().getTextContent(); //[7]取出書的名字 System.out.println("content:"+content); }

2、sax解析實現

dom特點把整個文件載入到記憶體 sax思想是一邊解析一邊處理一邊釋放記憶體
具體實現程式碼步驟如下
     //[1]構建工廠 
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //[2]通過工廠獲取sax解析器 
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //[3]開始解析xml  第二個引數是事件的處理器 
        saxParser.parse("bookstore.xml", new MyDefaultHandler());
    }
    //定義事件的處理器
    class MyDefaultHandler extends DefaultHandler{
        //  接收文件開始的通知。
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            System.out.println("文件開始");
        }
        // 接收元素開始的通知。
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);

            System.out.println("startElement");
        }
        //接收元素中字元(文字)資料的通知
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            super.characters(ch, start, length);
            String content = new String(ch, start, length);
            if (content!=null&&content.trim().length()>0) {

                System.out.println("characters--文字"+content);
            }
        }
        //接收元素結束的通知。
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            super.endElement(uri, localName, qName);
            System.out.println("endElement");
        }
        //接收文件結束的通知。
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            System.out.println("文件結束");
        }
    }

3、xmlpull解析的實現

原理:類似sax 一邊解析 一邊處理 它是Android內建的解析器
//程式碼的實現
[1]匯入xmlpullparser相關的jar包
[2]具體的程式碼實現 
//[0]建立一個集合
    List<Book> lists = null;
    Book book = null;
    //[1]構建工廠 
    XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
    //[2]通過工廠獲取 xmlpullparser解析器 
    XmlPullParser parser = xmlPullParserFactory.newPullParser();
    //[3]開始解析xml  arg1編碼的方式
    parser.setInput(new FileInputStream("bookstore.xml"), "utf-8");
    //[4]獲取解析的事件型別 
    int eventType = parser.getEventType();  //代表解析到了文件的開頭   
    //[5]不到檔案的結尾就一直解析 
    while(eventType!=XmlPullParser.END_DOCUMENT){
        switch (eventType) {
        case XmlPullParser.START_TAG:  //代表解析的開始標籤
            //[6]具體判斷一下解析到了哪個開始標籤
            if("bookstore".equals(parser.getName())){
                //[7]建立list集合
                lists= new ArrayList<Book>();
            }else if("book".equals(parser.getName())){
                //[8]建立javabean物件
                book = new Book();
                //[9]獲取id的屬性 getAttributeValue 獲取開始標籤的一個屬性值
                String id = parser.getAttributeValue(0);
                book.setId(id);                     
            }else if("name".equals(parser.getName())){
                //pull解析注意獲取標籤包裹的內容則是 使用 .NextText()
                //而不是使用getText();
                String name = parser.nextText();
                book.setName(name);                     
            }else if("price".equals(parser.getName())){
                String price = parser.nextText();
                book.setPrice(price);               

            }
            break;
        case XmlPullParser.END_TAG:  //代表解析的結束的標籤
            if("book".equals(parser.getName())){
                //把book物件加入到list集合中
                lists.add(book);
            }
            break;
        }
        //獲取下一個標籤的型別
        eventType = parser.next();
        //[6]一直解析 

    }
    //最後一步 列印一下集合的資訊 
    for (Book l : lists) {
        System.out.println("l~~~"+l);
    }