XML解析和JSON

day01學習總結

(1)XML

可擴展標記語言
主要用來傳輸和保存數據
現在一般用做配置文件

(2)DOM解析XML文件

DOM解析原理:DOM 是將XML文檔當作一棵樹型結構,而樹葉被定義爲節點 。

優點:可以進行增刪改查
缺點:由於把整個文檔加載到內存中.所以會造成內存泄露

DOM 解析XML文件一般分爲三步:
1.創建DocumentBuilderFactory對象,調用自身的newInstance()方法

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();  

2.創建documentBuilder對象

DocumentBuilder db=dbf.newDocumentBuilder();  

3.創建解析器,是一個Document類型:

Document parser=db.parser("*.xml");  

這三步是用DOM 解析XML文件的必須步驟。接下來的是要利用parser來開始解析文件。

1.得到文檔的根節點root
2.利用getChildNodes()方法獲得他的子節點

NodeList list=root.getChildNodes();  

3.利用NodeList的兩個方法,可以遍歷list

    for(int i=0;i<list.getLength();i++){  
        Node node =list.item(i);  
    }     

4.加入元素下面還有子元素,可以繼續重複上面的過程。
5.如果沒有子元素,想得到元素的值,可以這樣:

    Elment element =(Element)list.item(i);  
    Text text =(Text) element2.getFirstChild();  
    String str=text.getTextContent();  

下面附一段DOM 解析XML的例子:

    DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();  
    DocumentBuilder db = dbf.newDocumentBuilder();  
    Document parse = db.parse("books.xml"); 
    Element root = parse.getDocumentElement();
    //System.out.println(root.getNodeName());
    NodeList childNodes = root.getChildNodes();
    for(int i=0;i<childNodes.getLength();i++){
        Node item = childNodes.item(i);
        if(!item.getNodeName().equals("#text")){
            System.out.println(item.getNodeName());
            Element element =(Element)item;
            String id=element.getAttribute("id");
            System.out.println("id:"+id);
            NodeList childNodes2 = item.getChildNodes();
            for(int j=0;j<childNodes2.getLength();j++){
                Node item2 = childNodes2.item(j);
                if(!item2.getNodeName().equals("#text")){

                    Element element2 =(Element)item2;
                    Text text =(Text) element2.getFirstChild();
                    String str=text.getTextContent();
                    System.out.println(item2.getNodeName()+":"+str);
                }
            }
        }
    }

SAX解析XML

定義:1、簡單應用程序接口(Simple Api For Xml) 他不是官方推薦是一個程序員社區研究出來
原理:一邊解析,一邊處理,一邊釋放
優點:不會有內存泄漏
缺點:不能進行增刪改

SAX解析XML過程:
1.創建SAXParserFactory工廠

    SAXParserFactory spf=SAXParserFactory.newInstance();  

2.創建解析器並開始解析文件

    SAXParser sp = spf.newSAXParser();
    sp.parse("books.xml", new MyDefaultHandler());   

這裏我們要注意的地方就是parser()方法的第二個參數,它是一個XML解析句柄。

        class MyDefaultHandler extends DefaultHandle{
        public void startDocument() throws SAXException{}  
        public void endDocument() throws SAXException{}  
        public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException{}  
        ublic void endElement(String uri, String localName, String qName)
        throws SAXException{}  
        public void characters(char[] ch, int start, int length)
        throws SAXException { }  

繼承D而faultHandler類,並覆蓋以上5個方法。這5個方法都是系統自動調用的。

XmlPullParser解析XML文件(重點)

Android內置的解析器
進行SAX解析時的第一件事就是要導包,kxml.jar,xmlpull.jar

直接上代碼

    List<Book> list=null;
    Book book=null;
    XmlPullParserFactory xpf =XmlPullParserFactory.newInstance();
    XmlPullParser xpp =xpf.newPullParser();
    xpp.setInput(new FileInputStream("books.xml"),"UTF-8");
    int eventType = xpp.getEventType();
    while(eventType!=XmlPullParser.END_DOCUMENT){
        switch (eventType) {
        case XmlPullParser.START_TAG:
            if(xpp.getName().equals("books")){
                list=new ArrayList<Book>();
            }else if(xpp.getName().equals("book")){
                book=new Book();
            }else if(xpp.getName().equals("name")){
                String name =xpp.nextText();
                book.setName(name);
            }else if(xpp.getName().equals("author")){
                String author=xpp.nextText();
                book.setAuthor(author);
            }else if(xpp.getName().equals("price")){
                String price=xpp.nextText();
                book.setPrice(price);
            }
            break;
        case XmlPullParser.END_TAG:
            if(xpp.getName().equals("book")){
                list.add(book);
                book=null;
            }

        default:
            break;
        }
        eventType=xpp.next();
    }
    System.out.println(list);
注意點:
  1. XmlPullParser的第三步是setInput(inputstream,charSet) ;
  2. eventType用來判斷是何種事件
  3. 類似XmlPullParser.END_DOCUMENT的都是XmlPullParser裏面的常量,不用直接用1,2等數字來表示
  4. 在switch語句中,判斷元素的名字的時候要用解析器,而不是用eventType。例如xpp.getName().equals(“name”);
  5. switch語句之後一定要用eventType=xpp.next();將指針後移,不然只能遍歷第一個元素。

JSON數據

JSON 是存儲和交換文本信息的語法。類似 XML.
JSON 比 XML 更小、更快,更易解析。
JSON的數據格式有兩種:
1. 對象 { },例如:

    {
    name:'張三',
    age:'18', 
    }  

2. 數組:[{},{},{}],例如:

    [ {
    name:'張三',
    age:'18', 
    },{
    name:'張三',
    age:'18', 
    }]   
json解析的實現

來一段代碼就一目瞭然了:

    //解析對象
    /*String str ="{name:'zhangsan',age:'20'}";
    JSONObject object = new JSONObject(str);
    String name = object.getString("name");
    String age = object.getString("age");
    System.out.println(name+" "+age);*/

    //解析數組
    String str="[{name:'zhangsan',age:'15'},{name:'lisi',age:'20'},"
            + "{name:'xiaoqiang',age:'23',sex:'man'}]";
    JSONArray array=new JSONArray(str);
    for(int i=0;i<array.length();i++){
        JSONObject object = (JSONObject)array.get(i);
        String name = object.getString("name");
        String age = object.getString("age");
        if(i==2){
            String sex = object.getString("sex");
            System.out.println(name+" "+age+" "+sex);
        }else{
            System.out.println(name+" "+age);
        }

    }  

總結

今天主要學了2種數據格式和3種解析方式,json更小更方便。3種解析方式中,前2種要了解,面試中經常要問到,第三種一定要掌握,在實際開發當中以後會用到。

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