理解XML DOM树结构

来源:互联网 发布:知乎为什么中国dota 编辑:程序博客网 时间:2024/05/01 17:19
一.引言XML是eXtensible Markup Language的缩写,它是一种可扩展性标识语言, 能够让你自己创造标识,标识你所表示的内容。DOM全称是Document Object Model(文档对象模型),定义了一组与平台和语言无关的接口,以便程序和脚本能够动态访问和修改XML文档内容、结构及样式。XML创建了标识,而DOM的作用就是告诉程序如何操作和显示这些标识。二.DOM树结构实际上XML将数据组织成为一棵树,DOM通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个的对象。这样通过操作这棵树和这些对象就可以完成对XML文档的操作,为处理文档的所有方面提供了一个完美的概念性框架。如下XML文档:<line id=”1”> the <bold>First</bold>line</line>

DOM的结构表示如下:




由于DOM“一切都是节点(everything-is-a-node)”,XML树的每个 Document、Element、Text 、Attr和Comment都是 DOM Node。由上面例子可知, DOM 实质上是一些节点的集合。由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点,如:Document、Element、Text、Attr 、CDATASection、ProcessingInstruction、Notation 、EntityReference、Entity、DocumentType、DocumentFragment等。在创建XML文件时,如定义如下的XML文档:<?xml version="1.0" encoding="UTF-8"?><students><!--this is an example--><student><name><first-name>Mike</first-name><last-name>Silver</last-name></name><sex>male</sex><class studentid="15">98211</class><birthday><day>3</day><month>3</month><year>1979</year></birthday></student><student><name><first-name>Ben</first-name><last-name>Silver</last-name></name><sex>male</sex><class studentid="16">98211</class><birthday><day>3</day><month>3</month><year>1980</year></birthday></student></students>我们很自然想象到能得到如下图的结构,但是这只是数据的描述,而不是DOM树的结构。

我们可以通过以下的代码得到上面的XML文档的根结点和根结点下孩子节点的数目。import javax.xml.parsers.*;import org.w3c.dom.*;import java.io.File;import xmlwriter.XMLProperties;public class Xml{public static void main(String args[]){ try{ File file=new File("links.xml");DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc=builder.parse(file);doc.normalize();Element theRoot = doc.getDocumentElement();NodeList theList=theRoot.getChildNodes();System.out.println("the students root has "+theList.getLength()+" children");}}}结果显示为:



但是从上面XML文档可以看出,students一共只有3个孩子节点(包括注释),但程序得到的结果确实有7个孩子结点。为什么呢?因为在DOM中节点和元素不是等价的,它的7个节点包括:两个student元素、注释及它们周围的文本节点。这些文本节点有可能是回车换行、空格或者退格,假如把这些回车换行、空格和退格都删除,那么DOM解释的时候就没有这些文本节点,孩子节点就真的只有3个了。下图是DOM树的精确描述:


三.常见的基本节点类型:文档、元素、属性、文本和注释XML 中共有12种节点类型,其中最常见的节点类型有5种:元素:元素是 XML 的基本组成单元。,描述XML的基本信息。属性:属性节点包含关于元素节点的信息,通常包含在元素里面,描述元素的属性。文本:包含许多文本信息或者只是空白。文档:文档节点是整个文档中所有其它节点的父节点。注释:注释是对相关的信息进行描述、注释。四.常见的基本方法:通过Jaxp包来解释XML文档后,对DOM的节点对象的基本操作有:appendChild(Node newChild):在本节点上增加一个新的孩子到孩子列表的后面。getAttributes():得到本节点的属性列表,返回类型为NamedNodeMap。getChildNodes():得到本节点的孩子列表,返回类型为NodeList。getFirstChild()、getLastChild():得到第一个和最后一个孩子节点。getNextSibling()、getPreviousSibling():得到本节点的下一个和前一个兄弟节点。getNodeName()、getNodeType()、getNodeValue():得到本节点的名称、类型和值。getParentNode():得到本节点的父亲节点。insertBefore(Node newChild, Node refChild):在本节点的refChild孩子节点前插入一个新的节点。removeChild(Node oldChild):删除oldChild孩子节点。以上列出对DOM树操作的一些常用的基本的方法,还有很多其他的方法,读者可以参考有关的规范。五.递归遍历DOM树DOM树结构和二叉树很相似,元素的孩子节点集合就是该元素的分支,但是属性节点不是元素的子节点,它只是描述该元素节点的一些性质而已,属于元素节点结构内部的一部分。以下是用java编写的一段遍历DOM的程序:public class RecurDOM(NodeList nodelist){Node node;int i;if(nodelist.getLength() == 0){// 该节点没有子节点返回return;}for(i=0;i<nodelist.getLength();i++){node = nodelist.item(i);if(node.getNodeType() == Node.ELEMENT_NODE)RecurDOM(node.getChildNodes());//递归调用}}六.小结:DOM是一种在浏览器内编程的模型,同时也是XML的主要接口,它与语言和平台无关,它是基于树的 API,它把所有的数据以父子的节点层次结构装入内存构成一棵树,这些节点的类型可以是元素、文本、属性、注释或其它。它允许开发者读取、创建、删除和编辑 XML 数据。在这再次强调,DOM的“一切都是节点(everything-is-a-node)”。本文的程序是用java编写的,使用Jaxp包来解释XML文档。本文的适用对象是理解 XML 基本概念并开始准备用DOM编写应用程序来操纵 XML文档 的开发者。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 万家乐热水器使用方法图解 万家乐燃气热水器打不着火 万家乐燃气热水器使用说明书 万家乐热水器使用方法 万家乐燃气热水器说明书 万家乐热水器说明书图片 万家乐燃气热水器电话 万家乐油烟机怎么样 万和和万家乐热水器哪个好 万家乐厨房电器怎么样 万家乐60升电热水器 万家乐50升电热水器 万家乐燃气热水器怎么用 万家乐燃气热水器怎么用图解 广东万家乐燃气具有限公司 万家乐热水器服务电话 万家乐电热水器插头 万家乐热水器打火打不着 万家乐燃气热水器安装 万家乐燃气灶松手熄火 万家乐电热水器服务电话 万家乐售后维修电话 万家乐燃气热水器好吗 万家乐燃气热水器16 万家乐电热水器价格表 万家乐电热水器好不好 万家乐和万和燃气灶哪个好 万家乐热水器服务热线 万家乐灶具质量怎么样 万家乐天然气热水器打不着火 万家乐燃气灶多少钱 万家乐燃气热水器e4 万家乐燃气热水器多少钱 万家乐燃气热水器12 万家乐燃气热水器服务电话 万家乐电热水器多少钱 万家乐燃气热水器忽冷忽热 万家乐电热水器质量怎么样 万家乐热水器打不着火的原因 万家乐灶具维修电话 万家乐燃气热水器排行