使用Xerces-J的DOM方式进行XML程序设计

--Node


  1. 简介与背景知识
  2. Xerces对DOM的实现
  3. 如何使用
  4. 动态创建一个DOM树
  5. 使用XMLSerializer序列化DOM对象
  6. 使用DOM的程序的实例

Node

Node是DOM中最重要的一个界面,是所有DOM对象的基础,要掌握DOM就必须熟悉理解Node,因此Node是我们介绍的重点。

Node(节点)可以用来描述XML文档中的任何级别的元素,一个文档可以被称作一个Node(节点),一个<…/>表示的部分可以被称作一个Node,一个用<…>…</…>表示的部分可以被称作一个Node,一个属性可以被称作Node,一段注释可以被称作Node,一条处理指令可以被称作Node,一段文字也是Node,总而言之,一个XML文档用DOM表示出来后就是由Node(节点)组成的一棵树。

下面我们介绍Node界面中定义的数据和方法。表2列出了Node中定义的数据,表3列出了Node中定义的方法。

表2:Node界面中定义的静态数据
数据 意义
short ATTRIBUTE_NODE 表示这个节点是一个Attr
short CDATA_SECTION_NODE 表示这个节点是一个CDATASection
short COMMENT_NODE 表示这个节点是一个Comment
short DOCUMENT_FRAGMENT_NODE 表示这个节点是一个DocumentFragment
short DOCUMENT_NODE 表示这个节点是一个Document
short DOCUMENT_TYPE_NODE 表示这个节点是一个DocumentType
short ELEMENT_NODE 表示这个节点是一个Element
short ENTITY_NODE 表示这个节点是一个Entity。
short ENTITY_REFERENCE_NODE 表示这个节点是一个EntityReference。
short NOTATION_NODE 表示这个节点是一个Notation。
short PROCESSING_INSTRUCTION_NODE 表示这个节点是一个ProcessingInstruction。
short TEXT_NODE 表示这个节点是一个Text

这些数据可以同Node界面中的getNodeType()方法协同使用,区分Node的类型。下面的一段程序演示了使用这些数据区分不同节点类型的基本方法。

switch( oNode.getNodeType() ) { case Node.ATTRIBUTE_NODE: System.out.println("This is a Attr"); break; case Node.CDATA_SECTION_NODE: System.out.println("This is a CDATASection"); break; default: System.out.println(“Other Node”); }

表3中提供了Node节点提供的方法及其使用说明。这些方法是由W3C为DOM制定的,不但在xml中可以使用,在支持DOM标准的HTML中一样可以使用。

表3:Node界面中声明的方法
方法 使用说明
Node appendChild(Node newChild) 在这个节点中增加一个子节点。这个新增加的子节点将被添加在子节点队列的尾部。如果参数实际上是一个DocumentFragment,其全部内容会被加入到子节点队列中。返回值为被添加的节点。
Node cloneNode(boolean deep) 这个方法复制这个节点,参数控制是否复制子节点,但是如果存在属性会复制所有的属性,包括由DTD定义产生的缺省属性。需要注意的是这个方法返回的节点不包括父节点属性,即getParentNode()返回null。
NamedNodeMap getAttributes() 返回一个包含所有的属性(Attributes)的NamedNodeMap。如果没有,则返回null。
NodeList getChildNodes() 返回一个包含所有的子节点的NodeList。或返回一个不包含任何节点的NodeList。
Node getFirstChild() 返回第一个子节点。若没有则返回null。
Node getLastChild() 返回最后一个子节点。若没有则返回null。
String getLocalName() 返回不包括名空间的局域名,若该节点不支持名空间,则返回null。
String getNamespaceURI() 返回节点的名空间URI,若没有,则返回null,而不是空的字符串。
Node getNextSibling() 返回这个节点后面的兄弟节点,如果没有,则返回null。Sibling为兄弟的意思。
String getNodeName() 返回节点的名字。
short getNodeType() 返回节点的类型,其类型如表2。
String getNodeValue() 返回节点的值。
Document getOwnerDocument() 返回包含此节点的Document。
Node getParentNode() 返回父节点。
String getPrefix() 返回名空间的前置部分。
Node getPreviousSibling() 返回前一个兄弟节点。若没有,则返回null。
boolean hasAttributes() 返回是否有属性。
boolean hasChildNodes() 返回是否有子节点。
Node insertBefore(Node newChild,

Node refChild)
在制定的节点处插入一个节点,插入的节点作为第一个参数,插入位置作为第二个参数。
boolean isSupported( String feature,

String version)
测试解析器是否支持某些特性和版本号。
void normalize() 调用此方法可以合并相邻的Text节点,消除空的Text节点。
Node removeChild(Node oldChild) 从子节点队列中去除一个节点,然后返回该节点。
Node replaceChild(Node newChild,

Node oldChild)
用第一个参数制定的节点取代用第二个参数制定的子节点。
void setNodeValue(String nodeValue) 设置节点的值。
void setPrefix(java.lang.String prefix) 设置名空间的前置值。