Android之DOM解析XML

一.DOM解析方法介绍

  DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。

  Android完全支持DOM解析。利用DOM中的对象可以对XML文档进行读取、搜索、修改、添加和删除等操作。

  DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、树形和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档—这就是DOM的工作原理。

  DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构这样代码就可以使用DOM接口来操作整个树结构。

  由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档就回很耗资源。当然,如果XML文档的内容比较小,采用DOM是可行的。

  XML基本的节点类型:

    node---DOM基本的数据类型

    Element---最主要的处理的对象是Element

    Attr---元素的属性

    Text---一个Element或者Attr的实际内容

    Document---一个代表整个XML文档,一个Document对象通常也称为一个树。

  优点:整个文档读入内存,方便操作,支持修改、删除和重新排列等多种功能。

  缺点: 将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

  使用场合: 一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存、CPU)。

二、DOM解析步骤

1. 首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

2. 利用DocumentBuilderFactory创建DocumentBuilder。

DocumentBuilder builder = factory.newDocumentBuilder();

3. 加载XML文档。

Document dom = builder.parse(inputStream);

4. 获取文档的根节点(Element)

 Element root = dom.getDocumentElement();

5. 获取根节点中的所有子节点的列表(NodeList)

 NodeList items = root.getElementsByTagName("person");

6. 然后再获取子节点列表中的需要读取的节点。

//所有子节点for (int i = 0; i < items.getLength(); i++) {
    //得到一个Person节点
    Element personNode = (Element) items.item(i);
    //获取Person节点下的所有子节点(标签之间的空白节点和name/age元素)
    NodeList childNodes = personNode.getChildNodes();   //子节点
    for (int j = 0; j < childNodes.getLength(); j++) {
        Node node = childNodes.item(j);     //判断是否为元素类型
        if (node.getNodeType() == Node.ELEMENT_NODE) {
             Element childNode = (Element) node;
             ...
         }
    }
}

三、DOM解析XML代码

1.创建一个XML文件itcase.xml,并将其放在res/raw文件夹下。
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="23">
        <name>liming</name>
        <age>30</age>
    </person>
    <person id="20">
        <name>lixiangmei</name>
        <age>25</age>
    </person>
</persons>

如果没有raw文件夹,就在res文件夹下创建一个raw文件夹,并创建xml文件。

2.修改视图
 <Button
        android:id="@+id/dom_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/fab_margin"
        android:gravity="center_horizontal"
        android:text="@string/DOM" />
<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
3.添加AnalyzeDOM类
package com.zhangmiao.analyzexmldemo;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

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

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

/**
 * Created by zhangmiao on 2016/12/14.
 */
public class AnalyzeDOM {

    public static List<Person> readXML(InputStream inputStream) {
        List<Person> persons = new ArrayList<>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document dom = builder.parse(inputStream);
            Element root = dom.getDocumentElement();
            NodeList items = root.getElementsByTagName("person");
            for (int i = 0; i < items.getLength(); i++) {
                Person person = new Person();
                Element personNode = (Element) items.item(i);
                person.setId(new Integer(personNode.getAttribute("id")));
                NodeList childNodes = personNode.getChildNodes();
                for (int j = 0; j < childNodes.getLength(); j++) {
                    Node node = childNodes.item(j);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        Element childNode = (Element) node;
                        if ("name".equals(childNode.getNodeName())) {
                            person.setName(childNode.getFirstChild().getNodeValue());
                        } else if ("age".equals(childNode.getNodeName())) {
                            person.setAge(new Short(childNode.getFirstChild().getNodeValue()));
                        }
                    }
                }
                persons.add(person);
            }
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return persons;
    }
}
4.修改MainActivity类
package com.zhangmiao.analyzexmldemo;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;

import org.xml.sax.InputSource;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.List;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "AnalyzeXMLDemo";

    private TextView mTextView;

    private InputStream inputStream;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        Button domButton = (Button) findViewById(R.id.dom_button);
        mTextView = (TextView) findViewById(R.id.text);

        domButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String result = "";
        inputStream = getResources().openRawResource(R.raw.itcase);
        switch (v.getId()) {case R.id.dom_button:
                result += "--------- DOM ---------" + "\n";
                if (inputStream == null) {
                    result = "inputStream is null";
                } else {
                    List<Person> personList = AnalyzeDOM.readXML(inputStream);
                    if (personList != null) {
                        for (int i = 0; i < personList.size(); i++) {
                            String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
                                    + " , age = " + personList.get(i).getAge() + ".\n";
                            result += message;
                        }
                    }
                }
                mTextView.setText(result);
                break;default:
                break;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

参考文章:

http://www.open-open.com/lib/view/open1392780226397.html

http://www.cnblogs.com/weixing/archive/2013/08/07/3243366.html

http://www.tuicool.com/articles/IvQvyq

时间: 2024-10-24 04:41:45

Android之DOM解析XML的相关文章

Android:Dom解析XML

与SAX和PULL解析不同,Dom解析是将XML文件全部载入,组装成一颗Dom树,然后通过节点以及节点之间的关系来解析XML文件,占用内存比较大,一般比较推荐用SAX和PULL来解析.和前面一样用同样的例子来分析一下. 首先自定义一个XML文件:Student.xml,注意是新建file而不是xml. <?xml version="1.0" encoding="utf-8"?> <students> <student id="

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析.DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好.但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式. 下面介绍使用DOM解析器对XML进行解析. 下面是我们需要解析的xml文件 <?xml version="1.0" encodin

Android DOM解析XML方法及优化

在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML.解析XML的方法有DOM, SAX, JDOM, DOM4J,本文中只使用了DOM,下面先介绍DOM的基础知识和解析XML的方法,然后再结合一个项目实例来实现从XML文件的下载到解析整个过程. DOM(Document Object Model,文档对象模型)定义了访问和操作XML的标准方法.基于

Java从零开始学四十二(DOM解析XML)

一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo name="手机品牌"> <Brand name="华为"> <Type name="U8650"> </Type> </Brand

Android网络下解析XML

XML(Extensible Markup Language)可拓展标记语言,它与HTML一样,都是SGML(标准通用标记语言),它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.在Android下有三种方式解析XML,分别为SAX.DOM.PULL:它们有各自的特点,在网络编程中会经常使用,根据实际情况选择哪一种解析方式. 1.内存占用 由于Android手机性能相对于PC还是

DOM解析XML文件

除了可以使用SAX解析XML文件,大家也可以使用熟悉的DOM来解析XML文件. DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOMAPI遍历XML树.检索所需的数据.使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单.但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小

Android几种解析XML方式的比较

https://blog.csdn.net/isee361820238/article/details/52371342 一.使用SAX解析XML SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 缺点是不能倒退. 二.使用DOM解析XML DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分.它是

Android 创建与解析XML(五)—— Dom4j方式

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 1.Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full sup

DOM解析XML

DOM的文档驱动 处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象 优点是:可以对XML文档进行增删改查的复杂操作,可以随时按照节点间的关系访问数据 缺点: 受内存容量限制,不能处理大的文档,由于没有索引机制,处理效率较低 DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来 操组整个树结构,其他点如下: 优点:整个文档树都在内存当中,便于操作:支持删