Android项目解析数据----XML解析(3种解析技术详解)

Android 提供了三种解析XML的方式:SAX(Simple API XML), DOM(Document Object Model), Android推荐的Pull解析方式

三种解析XML的方式都要使用JavaBean;

现在这里列一下他们共同使用的JavaBean:

public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    private int age;
    private String name;
    private String sex;
    private String address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String id;

    public String getLike() {
        return like;
    }

    public void setLike(String like) {
        this.like = like;
    }

    private String like;
    public String Usershow(){

        Log.e("User", "id:"+id+" 名字:" + name + " 年龄:" + age + " 性别:" + sex + " 地址:" + address + " 个人爱好:" + like);
        return "名字:" + name + " 年龄:" + age + " 性别:" + sex + " 地址:" + address + " 个人爱好:" + like;

    }

下面分别介绍他们的使用:

1.DOM方式解析

DOM,即对象文档模型,它是将整个XML文档载入内存(所以效率较低,不推荐使用),每一个节点当做一个对象,结合代码分析。DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。 由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的。 
工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档,编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容。

缺点: 一次性的完全加载整个xml文件,需要消耗大量的内存。

使用步骤:

  1. 首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory单例
  2. 然后利用DocumentBuilderFactory创建DocumentBuilder
  3. 然后加载XML文档(Document)
  4. 然后获取文档的根结点(Element)
  5. 然后获取根结点中所有子节点的列表(NodeList)

然后使用再获取子节点列表中的需要读取的结点。

private List xmlconvertObject(InputStream stream){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        List lists = new ArrayList<>();
        try {

            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(stream);
            Element element = document.getDocumentElement();
            NodeList list = element.getElementsByTagName("person");
            for (int i =0;i

2.web端下载XML文件

 使用HttpURLConnection返回一个InputStream,其他和上面一样

 URL url = new URL(urls);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream stream = connection.getInputStream();
            return stream;

2. SAX解析方式

SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
优点:解析速度快,占用内存少。非常适合在Android移动设备中使用。 
缺点:不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。 

1.新建 一个 类继承 DefaultHandler 类,并重写父类的五个方法

  • startDocument(): 开始解析XML时调用
  • startElement(): 开始解析某个结点时调用
  • characters(): 在获取节点内容时调用
  • endElement(): 在完成解析某个结点时调用
  • endDocument(): 在完成整个XML解析的时候调用.

2.创建SAX工程类

创建SAXParserFactory类,没有提供公开的构造方法(单例模式),必须使用它的静态方法newInstance()来获得对象实例。获得SAXParser必须使用SAXParserFactory.neSAXParser()获得

3.创建Handler,进行解析

SAXParserFactory factory = SAXParserFactory.newInstance();

        try {
            SAXParser parser = factory.newSAXParser();
            MySAXHandler handler = new MySAXHandler();
            parser.parse(stream,handler);
            stream.close();
            return handler.getperson();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

4.web端下载XML文件

和DOM方法一致,此处不讲了

Pull 方式解析

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

**解析过程:**XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parsernextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。

优点: PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。

对于pull,只有一个关键的next()方法需要了解一下,它是用于检索下一个事件,并有五个事件,这五个分别是:

  • START_DOCUMENT:文档的开始,解析器尚未读取任何输入。
  • START_TAG:开始标签的解析。
  • TEXT:标签内元素的内容解析。
  • END_TAG:结束标签的解析。
  • END_DOCUMENT:文档的结束。

虽然说关键方法只有一个用于检索下一事件的方法next(),但是还存在一些方法也可以检索下一事件,用于不同的情况下使用,如:nextText():用于检索下一元素的文本;nextTag():用于检索下一元素的标签。

  • 需要建立一个XMLPULL解析器对象。通过XmlPullParserFactory对象得到解析器对象XmlPullParser。
  • 再使用XmlPullParser.setInput()方法设置解析器的输入。
  • 之后再通过判断事件类型,循环调用next()方法获得解析的数据。

1.创建工厂类

对于XmlPullParserFactory类,没有提供公开的构造方法(单例模式),必须使用它的静态方法newInstance()来获得对象实例。获得XmlPullParser必须使用XmlPullParserFactory.newPullParser()获得。

 private List parseXMLByPull(InputStream stream) {
        List lists = null;
        Person person = null;
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(stream, "utf-8");
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        lists = new ArrayList();
                        break;
                    case XmlPullParser.START_TAG:
                        if (parser.getName().equals("person")) {
                            person = new Person();
                            String id = parser.getAttributeValue(null, "id");
                            person.setId(id);
                        } else if (parser.getName().equals("name")) {
                            if (person != null) {
                                String name = parser.nextText();
                                person.setName(name);
                            }
                        } else if (parser.getName().equals("age")) {
                            if (person != null) {
                                int age = parser.next();
                                person.setAge(age);
                            }

                        } else if (parser.getName().equals("sex")) {
                            if (person != null) {
                                String sex = parser.nextText();
                                person.setSex(sex);
                            }
                        } else if (parser.getName().equals("address")) {
                            if (person != null) {
                                String address = parser.nextText();
                                person.setAddress(address);
                            }
                        } else if (parser.getName().equals("like")) {
                            if (person != null) {
                                String like = parser.nextText();
                                person.setLike(like);
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if (parser.getName().equals("person")) {
                            lists.add(person);
                            person = null;
                        }
                        break;
                }
                eventType = parser.next();
            }
            return lists;
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

2.web端下载XML文件

和DOM方法一致,此处不讲了

你可能感兴趣的:(安卓,android,XML,web)