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种要了解,面试中经常要问到,第三种一定要掌握,在实际开发当中以后会用到。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值