DOM解析XML
org.w3c.dom
1. DOM(Document Object Model)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
【优点】
①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】
①通常需要加载整个XML文档来构造层次结构,消耗资源大。
2. DOM的四个基本接口
在DOM接口规范中,有四个基本的接口:Document, Node, NodeList, NamedNodeMap。
Document
Document接口是对文档进行操作的入口,它是从Node接口继承过来的。
Node
Node接口是其他大多数接口的父类。
在DOM树中,Node接口代表了树中的一个节点。
NodeList
NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。
它提供了对节点集合的抽象定义,并不包含如何实现这个节点集的定义。
NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。
在DOM中,NodeList的对象是live的,对文档的改变,会直接反映到相关的NodeList对象中。
NamedNodeMap
NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点,这个接口主要用在属性节点的表示上。
尽管NamedNodeMap所包含的节点可以通过索引来进行访问,但是这只是提供了一种枚举方法,NamedNodeMap所包含的节点集中节点是无序的。
与NodeList相同,在DOM中,NamedNodeMap对象也是live的
/**
* 使用DOM解析xml
*
* @author xiazhang
* @date 2017-6-5
*/
public class DomParseXmlTest {
public static void parsexml(String fileName){
try {
//step1:实例化一个DOM构建器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//step2:通过DOM构建器工厂获取一个DOM构建器
DocumentBuilder db = dbf.newDocumentBuilder();
//step3:builder.parse()方法将给定文件的内容解析为一个XML文档, 并且返回一个新的 DOM Document对象
//Document文档操作入口
Document document = db.parse(fileName);
//直接根据标签名访问任意节点
NodeList list = document.getElementsByTagName("name");
System.out.println(list.getLength());
for (int s = 0; s < list.getLength(); s++) {
//打印为Null,使用list.item(s).getFirstChild().getNodeValue()
System.out.println(list.item(s).getNodeValue());
System.out.println(list.item(s).getFirstChild().getNodeValue());
//System.out.println(list.item(s).getTextContent());
}
//step4:获取document的所有子节点(不包括属性节点),返回一个NodeList对象。注意,在DOM解析时会将所有回车都视为节点
NodeList users = document.getChildNodes();
//获取文档的根元素
Element rootElement = document.getDocumentElement();
//获取根元素的属性
System.out.println(rootElement.getAttribute("xmlns"));
System.out.println(rootElement.getAttribute("nihao"));
//users.getLength() 节点长度
for (int i = 0; i < users.getLength(); i++) {
//获取childNodes的第i个节点
Node user = users.item(i);
//则获取childNode的所有子节点(不包括属性节点),返回一个NodeList对象
NodeList userInfo = user.getChildNodes();
for (int j = 0; j < userInfo.getLength(); j++) {
Node node = userInfo.item(j);
NodeList userMeta = node.getChildNodes();
for (int k = 0; k < userMeta.getLength(); k++) {
if(userMeta.item(k).getNodeName() != "#text"){
System.out.println(userMeta.item(k).getNodeName()
+":"+ userMeta.item(k).getTextContent());
}
}
System.out.println();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
parsexml("testXml.xml");
}
}
解析所使用的XML
<?xml version="1.0" encoding="UTF-8"?>
<users nihao="hello" xmlns="http://test.org/books">
<user id="0">
<name>xiazhang</name>
<age>23</age>
<sex>男</sex>
</user>
<user id="1">
<name>jinnan</name>
<age>25</age>
<sex>女</sex>
</user>
</users>