节点暴露了一些导航元素供你在文档树上移动。parentNode方法返回当前节点的父节点,而nextSibling和previousSibling方法则返回位于当前节点右边或者左边的兄弟节点。检查hasChildNodes属性还可以让你知道给定的节点是否存在子节点。
假设某一节点存在子节点,这些子节点就可以用ChildNodes属性检索。ChildNodes用NodeList结构返回当前节点所有的直属(低1级)子节点。NodeLists
是代表一组节点的有序列表(按索引号获取),而它们的同类NamedNodeMaps则把这些返回的节点表示为字典(按名称获取)。这两种对象都是“活”的对象,意思是说对列表的任何修改都会立即受到对象树的反应。
节点对象还暴露了一组增加并且删除子节点的方法。 insertBefore方法在子节点列表内指定节点之前(在左边)直接插入一个新节点,而appendNode方法则在当前节点的子节点列表的末尾(最右边)附加新节点。replaceNode
方法直接用其他节点代替指定子节点,而removeNode则从子节点组中删除给定的节点。
我已经说过了,节点接口提供了导航文档以及修改文档树的便捷方法,但为了能真正完成大部分有意义的工作,你首先要钻研那些抽象的DOM接口。在本文章的余下部分,我就引领读者考察部门此类接口。
Document接口对Node接口进行了扩展以代表完整的XML文档,同时提供了文档树的根元素(<XML>元素)。你在装载一个XML文档时大多数实现都会传递给你一个文Document对象。Document是一种影响文档整体而并不真正适用于其他方面的产物。其大多数方法主要作为创建其他DOM对象的工厂方法。这些形如“createX”的方法可以为那些不支持传统构造器语言实现创建Element、DocumentFragment、TextNode、CDATASection、ProcessingInstruction、属性(Attr)、EntityReference以及各类名称空间节点。
Document还包括两种在文档内移动到特定位置的有用方法:
Document接口还有一个很有意思的地方,其Node接口暴露了一个ownerDocument性质,通过它可以返回该节点的父Document对象。
我走的急了点,在谈到Element接口之前竟然先讨论了两种获取元素的方法。好的,回过头来,在这里Element如你所期望的那样就是代表XML元素。
element接口主要处理属性(也可以由根node接口所用),其13个方法提供了访问多种属性的形式。在这其中,你可能最常用到getAttribute/setAttribute和getAttributeNode/setAttributeNode方法。前者允许你在提供了属性名称的前提下直接读写属性值。后者则允许你操作代表属性的实际Attr对象。
Element接口的过人之处是任何检索数据的方法都关联某一元素。这是因为给定元素的数据被当作该元素的子节点,而子节点则可以通过根Node接口的ChildNodes属性获取。如果子节点只包含了字符数据,那么元素的数据节点就只实现Text接口。然而,在复杂数据的情况下,实现适当的Element、Attr和/或Text接口的一组子节点,按照数据的类型即可代表元素的子节点。
图B所示为元素及其数据节点之间的复杂关系。
图B
在处理XML时,有个常见的任务就是创建新的元素并把它们附加到现有的文档。DocumentFragment接口以修改插入方法(insertBefore、appendNode和replaceNode)行为的方式略微扩展了node以便在DocumentFragment插入文档的情况下,只有其子节点被插入,而DocumentFragment节点自身则不被插入。这样就促使DocumentFragment成为XML树内新节点的一种理想的临时附着点。
以上就是我们对DOM基础知识的阐述。下一部分我们接着介绍这一XML教程三部曲的SAX API 部分。