DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对
这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制
表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,
因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的
具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students>
<student>
<name sex="man">小明</name>
<nickName>明明</nickName>
<age>20</age>
<address>北京</address>
</student>
<student>
<name sex="woman">小红</name>
<nickName>红红</nickName>
<age>20</age>
<address>上海</address>
</student>
<student>
<name sex="man">小亮</name>
<nickName>亮亮</nickName>
<age>30</age>
<address>广州</address>
</student>
<student-0>
<name sex="man">小亮-0</name>
<nickName>亮亮-0</nickName>
<age>200</age>
<address>广州-0</address>
</student-0>
</students>
(2) 解析:
private void parseXml() {
long startTime = System.currentTimeMillis();
System.out.println("开始解析: " + startTime);
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
// 获得student的List, 注意:这里要用xml中student,而不是students节点
NodeList studentList = doc.getElementsByTagName("student");
for (int i = 0; i < studentList.getLength(); i++) {
// 获得student标签
Node node = studentList.item(i);
// 获得student标签里面的标签
NodeList childNode = node.getChildNodes();
// 新建student对象
Bean1 bean = new Bean1();
// 遍历student标签里面的标签
for (int j = 0; j < childNode.getLength(); j++) {
Node item = childNode.item(j);
if (item.getNodeName().equals("name")) {
bean.setName(item.getTextContent());
// 获取name节点的属性
NamedNodeMap map = item.getAttributes();
// 获取sex属性,由于只有一个属性,所以取0
Node sexNode = map.item(0);
bean.setSex(sexNode.getTextContent());
} else if (item.getNodeName().equals("nickName")) {
bean.setNickName(item.getTextContent());
} else if (item.getNodeName().equals("age")) {
bean.setAddress(item.getTextContent());
} else if (item.getNodeName().equals("adress")) {
bean.setAddress(item.getTextContent());
}
}
datas.add(bean);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
long finishTime = System.currentTimeMillis();
long time = finishTime - startTime;
System.out.println("结束解析: " + finishTime + "\nDom解析耗时:" + time);
for(Bean1 student : datas){
System.out.println(student.toString());
}
}
demo传送门:
https://github.com/215836017/ParseXML_javahttps://github.com/215836017/ParserXML_android
注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。