org.w3c.dom
1. DOM(Document Object Model)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
【优点】 ①允许应用程序对数据和结构做出更改。 ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。 【缺点】 ①通常需要加载整个XML文档来构造层次结构,消耗资源大。
2. DOM的四个基本接口
在DOM接口规范中,有四个基本的接口:Document, Node, NodeList, NamedNodeMap。
Document接口是对文档进行操作的入口,它是从Node接口继承过来的。
Node接口是其他大多数接口的父类。
在DOM树中,Node接口代表了树中的一个节点。
NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。
它提供了对节点集合的抽象定义,并不包含如何实现这个节点集的定义。
NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。
在DOM中,NodeList的对象是live的,对文档的改变,会直接反映到相关的NodeList对象中。
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>