现在的位置: 首页 > 综合 > 正文

xml基础–解析(DOM)

2018年01月24日 ⁄ 综合 ⁄ 共 2298字 ⁄ 字号 评论关闭

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+">");
	}

抱歉!评论已关闭.