xml解析

一.xml介绍:

1.XML:Extensible Markup Language,即可扩展标记语言. 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.

二.Xml解析:

1.PULL
Pull 内置于 Android 系统中。也是官方解析布局文件所使用的方式。Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。
而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。

2.SAX
SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。缺点是不能倒退。

3.DOM
DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点是加载大文档时效率低下。

4.SAX、DOM、Pull三种解析方式的比较
内存占用:SAX、Pull比DOM要好;
编程方式:SAX 采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类 XML,就要编写一个新的适合该类XML的处理类。DOM 是 W3C 的规范,Pull 简洁。
访问与修改:SAX 采用流式解析,DOM 随机访问。
访问方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。
1.Pull解析

package com.example.day12_xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class PullUtils {
    public static ArrayList<Student> pull(InputStream is){
        ArrayList<Student> list = new ArrayList<>();
        try {
            //获取解析工厂
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            //获取解析工厂对象
            XmlPullParser xmlPullParser = factory.newPullParser();
            //放入解析数据
            xmlPullParser.setInput(is,"UTF-8");
            //开始解析
            int type = xmlPullParser.getEventType();
            Student student = null;
            while (type != XmlPullParser.END_DOCUMENT){
                if (type == XmlPullParser.START_TAG){
                    if ("Student".equals(xmlPullParser.getName())){
                        student = new Student();
                    }else if ("name".equals(xmlPullParser.getName())){
                        String age = xmlPullParser.getAttributeValue(0);
                        String sex = xmlPullParser.getAttributeValue(1);
                        student.setAge(age);
                        student.setSex(sex);
                        String name = xmlPullParser.nextText();
                        student.setName(name.trim());
                    }else if ("hobby".equals(xmlPullParser.getName())){
                        String hobby = xmlPullParser.nextText();
                        student.setHobby(hobby.trim());
                    }
                }else if (type == XmlPullParser.END_TAG){
                  if ("Student".equals(xmlPullParser.getName())){
                      list.add(student);
                  }
                }
                type = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        return list;
    }
}

2.DOM解析

package com.example.day12_xml;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class DomUtils {
             public static ArrayList<Student> dom(InputStream is) throws ParserConfigurationException, IOException, SAXException {
                 ArrayList<Student> list = new ArrayList<>();
                 //获取解析工厂
                 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
                 //获取解析工厂对象
                 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
                 //放入解析数据
                 Document document = documentBuilder.parse(is);
                 NodeList students = document.getElementsByTagName("Student");
                 for (int i = 0; i < students.getLength(); i++) {
                     Node student = students.item(i);
                     Student stu = new Student();
                     NodeList childNodes = student.getChildNodes();
                     for (int j = 0; j < childNodes.getLength(); j++) {
                         Node child = childNodes.item(j);
                         if (child.getNodeName().equals("name")){
                             String name = child.getTextContent();
                             NamedNodeMap map = child.getAttributes();
                             String age = map.getNamedItem("age").getNodeValue();
                             String sex = map.getNamedItem("sex").getNodeValue();
                             stu.setName(name);
                             stu.setSex(sex);
                             stu.setAge(age);
                         }else if (child.getNodeName().equals("hobby")){
                             String hobby = child.getTextContent();
                             stu.setHobby(hobby);
                         }
                     }
                     list.add(stu);
                 }
                 return list;
             }
}

3.SAX解析

package com.example.day12_xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxUtils {
           public static ArrayList<Student> list = new ArrayList<>();
            public static ArrayList<Student> sax(InputStream is) throws ParserConfigurationException, SAXException, IOException {
                //获取解析工厂
                SAXParserFactory factory = SAXParserFactory.newInstance();
                //获取解析工厂对象
                SAXParser saxParser = factory.newSAXParser();
                //放入解析数据
                saxParser.parse(is,new MyHelper());
                return list;
            }
      static class MyHelper extends DefaultHandler{
                Student student;
                String str;
          @Override
          public void startDocument() throws SAXException {
              super.startDocument();
          }

          @Override
          public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
              super.startElement(uri, localName, qName, attributes);
              if ("Student".equals(qName)){
                  student = new Student();
              }else if ("name".equals(qName)){
                  String age = attributes.getValue(0);
                  String sex = attributes.getValue(1);
                  student.setAge(age);
                  student.setSex(sex);
              }
          }

          @Override
          public void endElement(String uri, String localName, String qName) throws SAXException {
              super.endElement(uri, localName, qName);
              if ("Student".equals(qName)){
                  list.add(student);
              }else if ("name".equals(qName)){
                  student.setName(str);
              }else if ("hobby".equals(qName)){
                  student.setHobby(str);
              }
          }

          @Override
          public void endDocument() throws SAXException {
              super.endDocument();
          }

          @Override
          public void characters(char[] ch, int start, int length) throws SAXException {
              super.characters(ch, start, length);
              String s = new String(ch, start, length);
              String trim = s.trim();
              if (!trim.equals("")){
                  str = trim;
              }
          }
      }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MX_XXS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值