1.简介:
DOM--Document Object Model(文档对象模型),在应用程序中,基于DOM的xml分析器交一个xml文档转换成一个对象模型集合(DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档听任何一部分数据,利用DOM接口的机制也称作随机访问机制。DOM强制使用树模型来访问XML文档中的消息。
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,可以任意地控制整个XML文档中的内容。由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此当文档比较大或者结构比较复杂时,对内存的需求就比较高。
DOM是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范
DOM文档树中的根节点与根元素结点:
根节点(document)代表的xml文档本身,是解析xml文档的入口
根元素节点(root)表示xml文档的根元素,对应于xml文档的Root
最常见的节点类型:
-元素:元素是XML的基本构件。元素可以有其它元素、文本节点或两者兼有来作为其子节点。元素节点还是可以有属性的唯一类型的节点
-属性:属性节点包含关于元素节点的信息,但实际不认为它是元素的子节点
-文本:文本,可以包含许信息或仅仅是空白
-文档(根节点):是整个文档中所有其它节点的父节点
不常见的节点类型:CDATA、注释、处理指令
DOM的基本接口:
文档对象模型利对象来把文档模型化,这些模型不仅描述了文档的结构,还定义了模型中对象的行为。换句话说,文档图中的节点不是数据结构,而是对象,对象中包含方法和属性。
DOM中,对象模型要实现:用来表示、操作文档的接口;接口的行为和属性;接口之间的关系以及互操作
Document接口---对文档进行操作的入口,从Node接口继承过来
Node接口--其他大多数接口的父类,例如Document,Element,Attribute,Text,Comment等接口都是从Node接口中继承过来
NodeList接口--是一个节点的集合,包含了某个节点的所有子节点
NamedNodeMap接口--也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,利用节点名可以直接访问特定的节点
2.DOM解析XML
1>步骤:
a.获得DOM解析器工厂----DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
b.获得具体DOM解析器---DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
c.解析XML文档,获得Document对象(根节点)
Document document=db.parse(new File("candidate.xml"));
NodeList list=document.getElementsByTagName("PERSON");
3.JAXP(Java API for xml parsing):用于xml解析的Java API。
4.DocumentBuilderFactory与DocumentBuilder的关系:
5.各种不同类型的Node的getNodeName()和getNodeValue()获取的不同值:
6.使用Dom递归解析xml文档
private static void parseXml(Element element){ String tagName=element.getNodeName(); System.out.print("<"+tagName); NodeList children=element.getChildNodes(); NamedNodeMap map=element.getAttributes(); if(0==map.getLength()&&0==children.getLength()){ System.out.print("/>"); return; } if(null!=map){ for(int i=0;i<map.getLength();i++){ Attr attr=(Attr)map.item(i); System.out.print(" "+attr.getNodeName()+"=\""+attr.getNodeValue()+"\""); } } System.out.print(">"); if(null!=children){ for(int i=0;i<children.getLength();i++){ Node node=children.item(i); short nodeType=node.getNodeType(); if(nodeType==Node.ELEMENT_NODE){ parseXml((Element)node); }else if(nodeType==Node.TEXT_NODE){ System.out.print(node.getNodeValue()); }else if(nodeType==Node.COMMENT_NODE){ System.out.print("<!--"); String data=((Comment)node).getData(); System.out.print(data); System.out.print("-->"); } } } System.out.print("</"+tagName+">"); }