DOM的诞生:随着XML(可扩展标记语言)的发展,出现了使用常见的编程语言(如JAVA)来同时表现和处理XML代码的需求。首先出现的是Java上的SAX。SAX提供了一个基于事件的XML解析的API。SAX解析器从文件的开头出发,从前向后解析,每当遇到起始标签或结束标签、特性、文本或者其他的XML语法时,就会出发一个事件。然后,当事件发生时,具体怎么做就由开发人员决定。虽然SAX仅仅还找文本的形式去解析他们,但是在解析的过程中,它无法停止、后退或者不从文件开始,直接访问XML的某个部分。这就催生了DOM的诞生。
DOM定义:DOM是针对XML的基于树的API,它关注的不仅仅是解析XML代码,而是使用一系列互相关联的对象来表示这些代码,而这些对象可以被修改和访问并且不需要重新去解析。使用DOM,只需解析一次代码来创建一个树的模型,在这个起始解析过程之后,XML已经通过DOM模型表现出来,同时不再需要原始的代码。
节点的层次:谈论DOM树实际上谈论的就是节点的层次
<?xml version=”1.0”?>
<employees>
<!— employeeà
<employee>
<name>Micheal Smith</name>
<position>Software</position>
<comment><![CDATA[birthday 8/14/]]</comment>
</employee>
</employees>
生成的DOM树
Node接口定义了一些所有节点都包含的特性和方法:
NodeName,nodeValue,nodeType,ownerDocument,firstChild,lastChild,previousSibling,nextSibling,hasChildNodes(),attributes,appendChild(node),removeChild(node),replaceChild(newnode,oldnode),insertBefore(newnode,refnode)
XHTM(HTML)DOM:基于XML的DOM技术成为核心DOM,在开发XML DOM的同时,W3C还一起开发了一种特别针对XHTML(HTML)的DOM。这个DOM定义了一个HTMLDodument和一个HTMLElement作为这种实现的基础。
处理特性:即使Node接口已经具有attributes方法,且已被所有类型节点继承,然后,只有Element节点才能有特性。Element节点的attribites属性提供一些勇于访问和处理内容的方法:
getNamedItem(name)—返回nodeName属性值等于name的节点
removeNamedItem(name)—删除nodeName属性值等于name的节点
setNamedItem(node)—将node添加到列表中,按其nodeName属性进行索引
item(pos)—像NodeList一样,返回位置pos的节点
这四个方法都返回一个Attr节点,而非特性值
getAttribute(name)=attributes.getNamedItem(name).value;
setAttribute(name,newvalue= attributes.getNamedItem(name).value=newvalue
removeAttribute(name)=attributes.removeNamedItem(name)
访问指定的节点
1. getElementsByTagName()//核心DOM方法
返回一个包含所有的tagName(标签名)特性等于某个指定值的NodeList(节点集合)
2. getElementsByName()//HTML DOM方法
获取所有name特性等于指定值的NodeList
3. getElementById()//HTML DOM方法
返回id特性等于指定值的元素
创建和操作节点
createElement(),createTextNode(),appendChild()
removeChild(),replaceChild(),insertBefore()
createDocumentFragment()//用于批量增加节点
HTML DOM特征功能
特性像属性一样:大部分情况下,HTML DOM元素中的所包含的所有特性都是可作为属性如:<img src=”mypicture.jpg” border=”0”>,用oImg来引用这个标签
oImg..getAttribute(“src”)==oImg.src
唯一特性名和属性名不一样的是class特性,因为它在javascript是一个保留字,所以不能直接拿来作为属性,相应额属性名为className
Table方法 略
遍历DOM
NodeIterator(深度优先搜索)
使用doument对象的createNodeIterator()方法来创建NodeIterator对象,该方法接受的四个参数为:
1. root—从书中搜索的那个节点
2. whatToShow—数值代码,代表哪些节点需要访问
3. filter—NodeFilter对象,用来决定忽略哪些节点
4. entityRegerenceExpansion—布尔值,表示是否需要扩展实体引用
TreeWalker
它有NodeIterator所有的功能,并且增加了一些遍历方法
1. parentNode()—进入当前节点的父节点
2. firstChild()—进入当前节点的第一个子节点
3. lastChild()—进入当前节点的最后一个节点
4. nextSibling()—进入当前节点的下一个兄弟节点
5. previousSibling—进入当前节点的前一个兄弟节点