Android XML DOM 解析 XML
DOM 解析 XML 文件时会将 XML 文件的所有内容以文档树的形式存放到内存中,然后就可以使用 DOM
API 遍历 XML 树、检索所需要的数据
使用 DOM
操作 XML 看起来比较直观,并且在编码方面比基于 SAX 的实现更加简单
但是,DOM
也有自己的缺点,因为它需要将 XML 文件中的所有内容放到内存当中,所以有可能内存消耗比较大,尤其是对于 Android 设备来说,设备的内存资源比较宝贵,如果文件比较大,还是建议使用 SAX
DOM 提供的 API
-
Documentbuilderfactory
解析器工厂类创建方法 Documentbuilderfactory factory = Documentbuilderfactory.newinstance();
-
DocumentBuilder
解析器类可以通过解析器工厂类来获得实例
DocumentBuilder builder = factory.newDocumentbuilder();
-
Document
文档树模型将要解析的 XML 文件读入 DOM 解析器
Document doc = builder.parse(context.getAssets().open("languages.xml"));
Document
对象代表了一个 XML 文档的模型树,所有的其它Node
都以一定的顺序包含在 Domcument 对象之内,排列成一个树状结构,以后对 XML 文档的所有操作都与解析器无关 -
NodeList
节点列表类一个包含一个或者多个 Node 的列表可看是一个节点数组,有以下两个方法
方法 说明 item(index) 返回集合的第 index 个 Node 项 getLength() 返回列表的节点数 -
Node
节点类DOM 中最基本的对象,代表文档中的抽象节点
-
Element
元素类Node
最重要的子对象,Element
中可以包含属性,因此有获取属性的方法方法 说明 getAttribute() 获取属性 getTagName() 获取节点名称 -
Attr
某个元素的属性值
需要注意的是
Attr
不是Element
的子对象,因为Attr
并不是DoM
树的一部分
DOM 的使用流程
-
获得 DOM 解析器的工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-
从 DOM 工厂中获得 dom 解析器
DocumentBuilder builder = factory.newDocumentBuilder();
-
把要解析的 xml 文件读入 DOM 解析器
Document doc = builder.parse(getAssets().open("languages.xml"));
-
使用
doc.getElementsByTagName()
方法根据节点名称查找节点,返回的是NodeList
实例NodeList nodeList = doc.getElementsByTagName("language")
-
遍历
nodeList
使用各种方法获取节点数据,属性,文本和子节点等
范例
-
创建一个 空的 Android 项目
cn.twle.android.DOMParser
-
在
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>
-
修改
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>
-
创建一个 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; } }
-
修改
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();} } }