在上一篇中,我们使用了在java1.5版本以后集成的SAX解析器解析XML文件,在这里,我们使用另外一种解析方式解析XML文件,DOM(文档对象模型)。
概念:
1、DOM就是一个对象化的XML数据接口;
2、一个与语言无关、与平台无关的标准接口规范;
3、它定义了HTML文档和XML文档的逻辑结构;
4、给出了一种访问和处理HTML文档和XML文档的方法(动态地创建文档,遍历文档结构,添加、修改、删除文档内容,改变文档的显示方式等等)。
组成:
DOM由三部分组成,包括:核心(core)、HTML和XML。
核心部分是结构化文档比较底层对象的集合;
HTML接口和XML接口两部分则是专为操作具体的HTML文档和XML文档所提供的高级接口,使对这两类文件的操作更加方便。
DOM的优势(相对于SAX方式)在于,DOM将解析完的数据以树状结构完整的放置在内存中,其结构信息非常完整,可以方便的便利所有节点,包括某个节点的父节点、子节点以及其兄弟节点等。
由于DOM方式解析需要完整的读入整个文档,其解析速度相对较慢,而且其解析完后要把文档信息以树状结构保存在内存中,导致其内存开销巨大。在Android这这种对资源比较紧缺的设备中,不推荐使用这种方式来解析较大的XML文件。
下面还是先写个Demo供大家参考:
新建一个Andriod工程,结构如下图所示:
新建一个测试用的XML文件,名称:student.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="20110701100">
<name>张三</name>
<age>22</age>
<sex>男</sex>
</student >
<student id="20110701101">
<name>李四</name>
<age>24</age>
<sex>男</sex>
</student >
<student id="20110701102">
<name>小丽</name>
<age>21</age>
<sex>女</sex>
</student >
</students>
将该文件放置在assets目录下。
接下来我们定义一个JavaBean,用来存放从XML文件中解析出来的数据:
Student.java
package com.xzq.bean;
public class Student {
private String name;
private String id;
private int age;
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
接下来就是解析DOM的工具类
package com.xzq.domparser.util;
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;
import com.xzq.dom.bean.Student;
public class ParserByDom {
public static List<Student> parseXML(InputStream input) {
List<Student> students = new ArrayList<Student>();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
Document dom;
dom = builder.parse(input);
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("student");
for (int i = 0; i < items.getLength(); i++) {
Student stu = new Student();
Element stuNode = (Element) items.item(i);
stu.setId(stuNode.getAttribute("id"));
NodeList childsNodes = stuNode.getChildNodes();
for (int j = 0; j < childsNodes.getLength(); j++) {
Node node = (Node) childsNodes.item(j);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element childNode = (Element) node;
if ("name".equals(childNode.getNodeName())) {
stu.setName(childNode.getFirstChild()
.getNodeValue());
} else if ("sex".equals(childNode.getNodeName())) {
stu
.setSex(childNode.getFirstChild()
.getNodeValue());
} else if ("age".equals(childNode.getNodeName())) {
stu.setAge(Integer.parseInt(childNode
.getFirstChild().getNodeValue()));
}
}
}
students.add(stu);
}
input.close();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return students;
}
}
代码都比较简单,不做详细介绍了,如有疑问可以qq交流:1420778971。
最后是MainActivity类,该类是整个Android工程的入口,实现如下:
package com.xzq.xmlparser;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import com.xzq.bean.Student;
import com.xzq.xmlparser.util.ParserBySAX;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AssetManager asset = getAssets();
try {
InputStream input = asset.open("Student.xml");
List<Student> list = ParserBySAX.parseXML(input);
for (Student stu : list) {
System.out.println("Person ID: " + stu.getId() + ","
+ stu.getName() + ", " + stu.getAge() + ", "
+ stu.getSex());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这里,我们仅仅是将解析得到信息打印在了Logcat中,你可以在自己的应用中使用listview等空间将解析得到的数据显示在屏幕上。欢迎发送邮件到我的邮箱一起交流:zhognnan09@gmail.com。