Android XML DOM 解析 XML

DOM 解析 XML 文件时会将 XML 文件的所有内容以文档树的形式存放到内存中,然后就可以使用 DOM API 遍历 XML 树、检索所需要的数据

使用 DOM 操作 XML 看起来比较直观,并且在编码方面比基于 SAX 的实现更加简单

但是,DOM 也有自己的缺点,因为它需要将 XML 文件中的所有内容放到内存当中,所以有可能内存消耗比较大,尤其是对于 Android 设备来说,设备的内存资源比较宝贵,如果文件比较大,还是建议使用 SAX

DOM 提供的 API

  1. Documentbuilderfactory 解析器工厂类

    创建方法
    
    Documentbuilderfactory factory =  Documentbuilderfactory.newinstance();
    
  2. DocumentBuilder 解析器类

    可以通过解析器工厂类来获得实例

    DocumentBuilder builder = factory.newDocumentbuilder();
    
  3. Document 文档树模型

    将要解析的 XML 文件读入 DOM 解析器

    Document doc = builder.parse(context.getAssets().open("languages.xml"));
    

    Document 对象代表了一个 XML 文档的模型树,所有的其它 Node 都以一定的顺序包含在 Domcument 对象之内,排列成一个树状结构,以后对 XML 文档的所有操作都与解析器无关

  4. NodeList 节点列表类

    一个包含一个或者多个 Node 的列表可看是一个节点数组,有以下两个方法

    方法 说明
    item(index) 返回集合的第 index 个 Node 项
    getLength() 返回列表的节点数
  5. Node 节点类

    DOM 中最基本的对象,代表文档中的抽象节点

  6. Element 元素类

    Node 最重要的子对象,Element 中可以包含属性,因此有获取属性的方法

    方法 说明
    getAttribute() 获取属性
    getTagName() 获取节点名称
  7. Attr

    某个元素的属性值

    需要注意的是 Attr 不是 Element 的子对象,因为 Attr 并不是 DoM 树的一部分

DOM 的使用流程

  1. 获得 DOM 解析器的工厂实例

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    
  2. 从 DOM 工厂中获得 dom 解析器

    DocumentBuilder builder = factory.newDocumentBuilder();
    
  3. 把要解析的 xml 文件读入 DOM 解析器

    Document doc = builder.parse(getAssets().open("languages.xml"));
    
  4. 使用 doc.getElementsByTagName() 方法根据节点名称查找节点,返回的是 NodeList 实例

    NodeList nodeList = doc.getElementsByTagName("language")
    
  5. 遍历 nodeList 使用各种方法获取节点数据,属性,文本和子节点等

范例

  1. 创建一个 空的 Android 项目 cn.twle.android.DOMParser

  2. app 上点右键,选择 Folder - Assets Folder 创建 assets 目录,并在 assets 目录下新建文件 languages.xml ,内容如下

    <?xml version="1.0" encoding="utf-8" ?>
    <languages>
        <language id="1">
            <name>Java</name>
            <rank>1</rank>
        </language>
        <language id="2">
            <name>C</name>
            <rank>2</rank>
        </language>
        <language id="3">
            <name>C++</name>
            <rank>3</rank>
        </language>
    </languages>
    
  3. 修改 activity_main.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp"
        android:orientation="vertical" >
    
        <Button
            android:text="解析"
            android:id="@+id/btn_parser"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/ms_dst"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="" />
    </LinearLayout>
    
  4. 创建一个 POJO 业务类 Language.java

    package cn.twle.android.domparser;
    
    public class Language {
        private int id;
        private String name;
        private String rank;
    
        public Language() {
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getId() {
            return this.id;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setRank(String rank) {
            this.rank = rank;
        }
    
        public String getRank() {
            return this.rank;
        }
    }
    
  5. 修改 MainActivity.java

    package cn.twle.android.domparser;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import java.util.ArrayList;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    public class MainActivity extends AppCompatActivity{
    
        private TextView ms_dst;
    
        private Button btn_parser;
    
        private ArrayList<Language> languages;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ms_dst = findViewById(R.id.ms_dst);
    
            languages = new ArrayList<Language>();
    
            btn_parser = findViewById(R.id.btn_parser);
            btn_parser.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    //获取文件资源建立输入流对象
                    try {
                            parser();
    
                        if (languages.equals(null)) {
                            ms_dst.setText("解析失败");
                        }
    
                        StringBuilder sb2 = new StringBuilder();
    
                        for (Language p1 : languages) {
                            sb2.append(p1.getId() + ". " + p1.getName() + "的排名是:" + p1.getRank() + "\n");
                        }
    
                        ms_dst.setText(sb2.toString());
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                }
            });
        }
    
        public void  parser() {
    
            try {
    
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    
                DocumentBuilder dbBuilder = factory.newDocumentBuilder();
    
                Document doc = dbBuilder.parse(getAssets().open("languages.xml"));
    
                NodeList nList = doc.getElementsByTagName("language");
                //⑤遍历该集合,显示集合中的元素以及子元素的名字
                for(int i = 0;i < nList.getLength();i++)
                {
                    //先从Person元素开始解析
                    Element languageElement = (Element) nList.item(i);
    
                    Language language = new Language();
    
                    language.setId(Integer.valueOf(languageElement.getAttribute("id")));
    
                    //获取person下的name和age的Note集合
                    NodeList childNoList = languageElement.getChildNodes();
                    for(int j = 0;j < childNoList.getLength();j++)
                    {
                        Node childNode = childNoList.item(j);
                        //判断子note类型是否为元素Note
                        if(childNode.getNodeType() == Node.ELEMENT_NODE)
                        {
                            Element childElement = (Element) childNode;
                            if("name".equals(childElement.getNodeName()))
                                language.setName(childElement.getFirstChild().getNodeValue());
                            else if("rank".equals(childElement.getNodeName()))
                                language.setRank(childElement.getFirstChild().getNodeValue());
                        }
                    }
                    languages.add(language);
                }
            } catch (Exception e) {e.printStackTrace();}
        }
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.