理解XMLDOM
节选自〈理解DOM〉
W3C对DOM的定义:
“The Document Object Model (DOM) is an application programming interface (API) for valid HTML and well-formed XML documents. It defines the logical structure of documents and the way a document is accessed and manipulated. In the DOM specification, the term "document" is used in the broad sense - increasingly, XML is being used as a way of representing many different kinds of information that may be stored in diverse systems, and much of this would traditionally be seen as data rather than as documents. Nevertheless, XML presents this data as documents, and the DOM may be used to manage this data.
With the Document Object Model, programmers can build documents, navigate their structure, and add, modify, or delete elements and content. Anything found in an HTML or XML document can be accessed, changed, deleted, or added using the Document Object Model.“
而本文中的DOM一词专指XML文档对象模型。
XML文档对象模型(DOM)是什么?
可扩展标记语言XML的基础是 DOM。XML 文档具有一个称为节点的信息单元层次结构;DOM 是描述那些节点和节点间关系的方式即作为 XML 数据的概念性描述。它定义了 XML 文档中出现的对象,以及用于访问和处理这些对象的方法和属性。
作为结构的DOM
DOM 文档是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航仪寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作(在 XML 结构内引用、检索和更改 XML 结构中的各项)。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序读取和处理 XML 数据。
DOM 路标图
创建层次
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。DOM 本质上是节点的集合。由于一个文档中可能包含不同类型的信息,因此要定义不同类型的节点。在创建 XML 文件的层次时,产生某些在概念上类似如下结构的内容是很自然的。虽然它是对所包括的数据的精确描述,但它不是对 DOM 所表示的数据的精确描述。这是因为它表示了 元素 ,但是没有表示 节点 。
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
<orders>
<order>
<customerid limit="150">251222</customerid>
<status>pending</status>
<item instock="Y" itemid="WB78">
<name>Winter Blanket (78 inch)</name>
<price>20</price>
<qty>10</qty>
</item>
</order>
<order>
<customerid limit="1000">12341</customerid>
<status>pending</status>
<item instock="Y" itemid="SA15">
<name>Silver Show Saddle, 16 inch</name>
<price>825.00</price>
<qty>1</qty>
</item>
<item instock="N" itemid="C49">
<name>Premium Cinch</name>
<price>49.00</price>
<qty>1</qty>
</item>
</order>
</orders>
元素和节点的区别
事实上,元素只是节点的一种类型,它们甚至不表示上图似乎要揭示的内容。 元素节点是信息的容器。该信息可能是其他元素节点、文本节点、属性节点或其他类型的信息。对该文档的更精确描绘如下:
矩形框表示元素节点,椭圆表示文本节点。 当一个节点包含在另一个节点之内时,它就被认为是后一个节点的孩子。
注意 orders 元素节点不是只有两个子节点,而是有五个子节点:两个 order 元素,以及它们之间后周围的文本节点。即使没有内容,order 元素之间的空白也会构成一个文本节点。类似地, item 具有七个子节点:name、price、qty,以及它们周围的四个文本节点。 (编者注:你可能会有疑问:在IE中编程时,如docmentElement.childNodes(0)却为第一个order 子元素节点,而不是相应的上面提到的空白文本节点;同样docmentElement.childNodes(1)却为第二个order 子元素节点。怎么会这样呢?这是因为IE所含的XML解析器为MSXML版本,它解析时忽略上面提到的空白文本节点;而在java中你就可以验证确实包含空白文本节点;在.NET中你设置xml文档的PreserveWhitespace属性为true,则包含空白文本节点,否则忽略。由此可见,不同的API实现DOM接口的方法不同。)还要注意,可能被认为是某个元素的内容的东西,比如“Premium Cinch”,实际上却是作为 name元素的子节点的文本节点的内容。(虽然本图并不完整,漏掉了属性节点以及其他内容。)
基本的节点类型
最常见的节点类型包括:
元素:元素是 XML 的基本构造模块。通常,元素拥有子元素、文本节点,或两者的组合。元素节点也是能够拥有属性的唯一节点类型。
属性:属性节点包含关于元素节点的信息,但是并不实际认为是元素的孩子,比如在下面的例子中:
<customerid limit="1000">12341</customerid>
文本:文本节点就是名副其实的文本。它可以由更多信息组成,也可以只包含空白。
文档:文档节点是文档中其他所有节点的父亲。
不太常见的节点类型:CDATA、注释、处理指令,以及文档片断
其他节点类型不太常用,但是在某些场合下仍然是必需的。它们包括:
CDATA:字符数据(Character Data)的缩写,这是一个特殊的节点,它包含不应该被解析器分析的信息。相反,它包含的信息应该以纯文本传递。例如,可能会为了特殊目的而存储 HTML 标签。在通常情形下,处理器可能尝试为所存储的每个标签创建元素,而这样可能导致文档不是格式良好的。这些问题可用通过使用 CDATA 节(section)来避免。
注释:注释包括关于数据的信息,通常被应用程序忽略。
处理指令:处理指令是专门针对应用程序的信息。其中一些例子包括要执行的代码或者关于从何处寻找样式表的信息。
文档片断:要使文档成为格式良好的,它必须仅有一个根元素。有时在使用 XML 的时候,必须临时创建多组元素,这些元素不一定满足这个要求。文档片断看起来类似如下:
<item instock="Y" itemid="SA15">
<name>Silver Show Saddle, 16 inch</name>
<price>825.00</price>
<qty>1</qty>
</item>
<item instock="N" itemid="C49">
<name>Premium Cinch</name>
<price>49.00</price>
<qty>1</qty>
</item>
其他类型的节点包括实体、实体引用节点,以及注解。
总结
DOM 是设计用于使用 XML 数据的、语言和平台无关的 API。这是一个基于树的 API,它将所有数据作为节点的父子层次加载到内存中,这些节点可以是元素、文本、属性或其他节点类型。
DOM API 允许开发人员读取、创建和编辑 XML 数据。DOM 的实现在 C++、Perl、javascript、Java、c#等多种语言中可用。
参考: W3C DOM Level 2
http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1590626202
http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
BTW:
DOMAPI学习http://www.infomall.cn/cgi-bin/mallgate/20031006/http://hedong.3322.org/archives/000228.html
DTD学习笔记http://www.infomall.cn/cgi-bin/mallnohead/20031005/http://hedong.3322.org/archives/000054.html
XMLDOM学习笔记http://www.infomall.cn/cgi-bin/mallgate/20031006/http://hedong.3322.org/archives/000055.html