androidのDOM方式解析XML
2015-07-01 14:57
459 查看
androidのDOM方式解析XML
在Android中,常见的XML解析器分别为DOM解析器、SAX解析器和PULL解析器第一种方式:DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。
DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档——这就是DOM的工作原理。
DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的。
常用的DoM接口和类:
Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。
Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。
Node:该接口提供处理并获取节点和子节点值的方法。
NodeList:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。
DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。
接下来看代码实现:
package com.wyl.example; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private TextView mTvShow; private Button mBtnDom; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); setListener(); } private void setListener() { mBtnDom.setOnClickListener(myListener); } private void findView() { mTvShow = (TextView) findViewById(R.id.textview); mBtnDom = (Button) findViewById(R.id.btnDom); } private OnClickListener myListener = new OnClickListener() { @Override public void onClick(View v) { // 1. 获取当前工程下的people.xml文件流 InputStream inputStream = MainActivity.class.getClassLoader() .getResourceAsStream("people.xml"); //定义Person对象 List<Person> persons = null; mTvShow.setText(""); switch (v.getId()) { case R.id.btnDom: //DOM mTvShow.setText("DOM:"); try { //使用DOMPersonService解析xml persons = DOMPersonService.readXml(inputStream); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; default: break; } //显示结果 for (Person person : persons) { mTvShow.setText(mTvShow.getText().toString() + "\n" + person.toString()); } } }; }
还要定义一个Person类
package com.wyl.example; public class Person { private Integer id; private String name; private Short age; public Person() { super(); } public Person(Integer id, String name, Short age) { this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Short getAge() { return age; } public void setAge(Short age) { this.age = age; } @Override public String toString() { return "id = " + id + "name = " + name + "age = " + age; } }
主要解析类
package com.wyl.example; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; //dom解析xml类 public class DOMPersonService { public static List<Person> readXml(InputStream inStream) throws ParserConfigurationException, SAXException, IOException { List<Person> persons = new ArrayList<Person>(); // 实力化一个文档构建工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 通过文档构建工厂构建文档构建器 DocumentBuilder builder = factory.newDocumentBuilder(); // 通过文档构建工厂构建文档实例 Document document = builder.parse(inStream); // 得到文档根结点 Element root = document.getDocumentElement(); // 得到所有的person节点 NodeList nodes = root.getElementsByTagName("person"); // 循环判断每个节点的内容 for (int i = 0; i < nodes.getLength(); i++) { // 得到节点对象 Element personElement = (Element) nodes.item(i); // 定义person对象 Person person = new Person(); // 得到xml属性 person.setId(Integer.valueOf(personElement.getAttribute("id"))); // 得到xml子结点 NodeList childNodes = personElement.getChildNodes(); for (int j = 0; j < childNodes.getLength(); j++) { // 得到每个结点对象 Node childNode = (Node) childNodes.item(j); // 如果当前节点为内容节点,取相应的内容 if (childNode.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) childNode; if ("name".equals(childElement.getNodeName())) { person.setName(childElement.getFirstChild() .getNodeValue()); } else if ("age".equals(childElement.getNodeName())) { person.setAge(new Short(childElement.getFirstChild() .getNodeValue())); } } } // 添加链表中 persons.add(person); } return persons; } }
最后看下解析的xml
<?xml version="1.0" encoding="UTF-8"?> <persons xmlns:pre="http://www.baidu.com"> <person id="001"> <name>coolszy</name> <age>22</age> </person> <person id="002"> <name>kuka</name> <age>23</age> </person> <person id="003"> <name>wyl</name> <age>30</age> </person> </persons>
注意:xml 文件放在src 目录下,不能放在package目录下这种使用
InputStream inputStream = MainActivity.class.getClassLoader().getResourceAsStream("people.xml");
Dom方式解析特点是一次性加载所有文件到内存中,然后根据DOM树方式进行解析,优点是解析速度快,缺点是比较耗费内存,不能中途停止。
相关文章推荐
- Android学习笔记--Animation
- android 查看android.keystore信息
- Android如何处理OOM
- Android Studio library发布JCenter编码错误_编码GBK的不可映射字符
- android 软键盘隐藏
- Android 4.4 eng版本 红框问题
- android中onNewIntent的简单说明
- Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- Android的AlertDialog详解(转载)
- android 项目R.java文件缺失导致编译错误
- Android Percent Layout 安卓百分比布局
- Android中的数据格式化
- Android---- 获取当前应用的版本号和当前android系统的版本号
- External SD card with ext4 under Android (CM10.1)
- Activity与Fragment数据传递之Fragment从Activity获取数据 分类: Android 2015-07-01 14:12 17人阅读 评论(0) 收藏
- Android 区别普通Touch方法和Scroll
- Android 使用DexClassLoader要执行其他apk方法
- Android ListViewitem滑动出现删除按钮
- Android 4.1.2为通知栏添加wifi开关
- Android 的sp 和 wp 类模板 以及RefBase类