--------------------------------------------XML之Dom解析XML------------------------------------------
一:概述
Dom解析(Document Object Mode)是一种基于对象的API,它把XML的内容加载到内存中,生成一个与XML文档内容对应的对象模型。当解析完成时,内存中会生成与XML文档的结构对应的DOM对象树。这样便能够根据树的结构,以节点的形式对文档进行操作。解析XML文件要比解析字符串、解析properties文件复杂的多,需要构建不止一个工具类对象。下面看一个使用DOM解析数据的程序,代码如下。
(1) music.xml
<?xml version="1.0" encoding="UTF-8"?>
<musics>
<music category="摇滚">
<name>江南style</name>
<author>PSY</author>
<county>韩国</county>
<date>20121205</date>
</music>
<music category="摇滚">
<name>航母style</name>
<author>网民</author>
<county>中国</county>
<date>20121205</date>
</music>
</musics>
(2) DomXML.java
package com.test;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomXML {
public static void main(String[] args) {
//创建解析的XML 文档对象
File xmlFile=new File("music.xml");
//声明一个 DocumentBuilder 对象 ,抽象类不能直接构建 ,可以通过DocumentFactory 来构建
DocumentBuilder builder=null;
//声明一个DocumentBuilderFactory 对象 ,通过单例模式创建
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
try {
//取得默认的 DocumentBuilder
builder=builderFactory.newDocumentBuilder();
//解析文件
Document document =builder.parse(xmlFile);
//获得根元素
Element root =document.getDocumentElement();
System.out.println("根元素:"+root.getNodeName());
//获得根元素下的子节点
NodeList childNodes=root.getChildNodes();
//遍历这些子节点 对每个子节点进行判断
for (int i = 0; i < childNodes.getLength(); i++) {
Node node=childNodes.item(i);
//如果节点名称为“airticle” 输出airticle 元素的属性category
if("music".equals(node.getNodeName())){
System.out.println("\r\n找到一首歌.所属分类:"+node.getAttributes().
getNamedItem("category").getNodeValue()+".");
NodeList nodeDetail= node.getChildNodes();
for (int j = 0; j < nodeDetail.getLength(); j++) {
Node detail= nodeDetail.item(j);
if("name".equals(detail.getNodeName())){
System.out.println("歌名:"+detail.getTextContent());
}else if("author".equals(detail.getNodeName())){
System.out.println("歌手:"+detail.getTextContent());
}else if("county".equals(detail.getNodeName())){
System.out.println("国家:"+detail.getTextContent());
}else if("date".equals(detail.getNodeName())){
System.out.println("发布日期:"+detail.getTextContent());
}
}
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
(3)附图
(4) 通过以上程序,可以总结出使用DOM 解析XML时,需要注意的问题。
1,首先要通过以下三个步骤创建XML文件对应的Document对象。
//获取factory
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//获取builder
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//解析为document 对象
Document document=builder.parse(xmlFile);
2,获取Document对象之后就可以通过Document的各种方法遍历整个XML内容了。
注意,XML解析只负责解析正确的XML,而不负责判断XML是否合法,更不会纠正XML语法错误,如果一个XML文件不符合语法,XML解析器会直接抛出解析异常。
缺点:
DOM解析的时候会把整个XML文件全部映射为Document里的树状结构,换言之,取到XML里的每个元素、属性、文本、注释都在Document 里有所体现。对于小的XML文件来说这样处理还是很方便的,但是当遇到比较大的XML文件的时候,DOM的缺点就显而易见了,它的内存占用比较大,而且查找速度比较慢。那怎么解决呢?别急,解析XML还有一种选择就是SAX,具体怎么做,请看下回分解。
author:huahuagongzi9999