|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
+ }; L/ j$ F' r4 X: I: S开放分类: 互连网、网页制作、web技术4 k3 f( N* T y( V9 v5 |' G
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
+ J9 w/ N1 W. D. p K- c& r& x
/ R9 ~9 V7 B/ oDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
3 h* C8 c, M, {
5 ^& b6 l# ^6 w' \6 z: ]对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
; ^% b( Y) |' Y+ @% sSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
. ^8 ]( T* X" y" ]8 V) K( x5 Q7 i9 N) B7 g
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段7 s) H: c3 c( @
& _7 Q1 w0 ?/ g" b% F0 w! ^0 S! w' [解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。& R* D0 R9 u% O C/ Q3 N$ j) {7 D
9 G6 H9 T4 H! G v4 i6 F' Q3 @2 H
作为 API 的 DOM7 U# A8 }3 [1 n7 ]# y2 p: N
2 u" i1 _" e+ u/ n- f5 _4 Y从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
$ v2 X8 p$ t1 c0 f0 z8 c) C+ i& \$ a; r6 r5 Y* H v
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。$ h+ d: _. Y. E+ d8 V
* E( j3 l- ^5 A/ D
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
1 o8 q/ t; }/ M7 s5 {: v
9 v2 {# j/ C: V# {9 d; D当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
- u! \( [1 s4 ~4 g: Y! g6 t, x7 \- C7 }8 I3 I/ d/ T8 u( Y& k
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。) f& u- b, \) o" m9 {
9 H+ W" F5 w6 |$ k
确定特性可用性. c, G- _8 N/ e9 [& b8 u
. Q9 a1 \4 S, d3 o* T, P0 ~" p1 zDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。 x1 Y0 }$ Z' D9 z! u2 l; K# m
$ p' z+ B N9 eDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。) u4 Q$ R& ?0 P! }# I9 G& U
R. |: ]# [5 ~import javax.xml.parsers.DocumentBuilderFactory;6 F8 ^* I- o) R6 u1 M! p& B- a
8 A1 Z! ^+ W) p/ b) U. @import javax.xml.parsers.DocumentBuilder;. R4 G$ J1 g3 L5 x2 S
2 K' ?$ n2 r E/ z! z: limport org.w3c.dom.DOMImplementation;
) `# [& d" M! e; O( I! L2 M6 t
3 |9 l2 [, P/ p, spublic class ShowDomImpl {
+ |, U* u" z' m) `" Z5 K# ^& }% D: s2 n" z2 y2 ^ z! e
public static void main (String args[]) {& p7 w9 u! }# E5 E V
0 L3 c9 I$ f6 ~2 D |try {
* v5 \- E6 p1 R& b3 D: Q3 Y' m6 _
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();" n; n F( g5 J1 S* _+ f
2 h! `/ n9 C" J6 @9 ]
DocumentBuilder docb = dbf.newDocumentBuilder();3 Q/ d6 Q! W% `! b* s
5 A; |; M( q- {4 M. X# {
DOMImplementation domImpl = docb.getDOMImplementation();
. I; e- z4 b7 x: {, \4 W8 n2 k2 P& c2 U2 w2 ^
if (domImpl.hasFeature("StyleSheets", "2.0")) {
$ B& Z: V3 }3 k4 }3 P" x! z$ ?4 Q5 o- q8 k/ ?: U
System.out.println("Style Sheets are supported.");
4 X) l$ B, j- D5 r/ i- @7 d4 j
. `( b" {. p! a9 O} else {
2 y9 e0 S7 v6 y; f1 R; S. I2 T8 E" z8 l8 \
System.out.println("Style Sheets are not supported.");" d( H4 G/ V9 d$ ~4 s6 n6 R% [$ g5 T
5 l6 o5 ^- q( G& q}
6 A3 y; P- F8 `1 r1 X, `' ^+ i Z ~* r/ ]- h7 q6 O- Q" S1 }
} catch (Exception e) {}
! ?7 G: V4 Y5 [8 c
% V3 }* |& D" Q& h* w, ]! P$ @}- l3 ]! f; S2 I; o" _$ P4 }
! q5 _" p7 ?2 Q}% J* R2 J, {; Q1 }
3 Y2 R; k* g- p% x# s+ P# z
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)$ m4 u1 N7 K' [0 [+ n$ Y
0 v/ d$ u. p, E本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。1 y2 Q6 D- h! G) m, o1 `, Q1 A9 Z
) Q# ] A2 v& }( i9 v) |5 T
基本的 XML 文件
6 Z, e0 ^: n3 O" S) |8 g3 M6 ?- M: V! }6 Y. l5 I" C8 K
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
- b# v- S: c& J; {1 F% p% z# k
/ z8 k' C# G A6 s! O, j, rXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
, \' o( X9 {" k3 O! Y% Q7 m) ~% X( a. D; T, y/ w, I
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。8 W& X/ Q; T, }* ` R7 q1 m
3 o4 k: x% r# ^
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
3 M1 H2 n! K7 m5 E- Q5 W) y1 j- g8 a" l. H! D8 P8 y/ u3 O8 W
<?xml version="1.0" encoding="UTF-8"?>! t: I6 h' `5 K' U9 }7 Z4 f% H
' |% P7 [8 M0 E, G9 U
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
2 e# E( S1 z4 U3 q4 S: Y* K
8 c) X9 U& @4 o" c/ N: {9 t& s+ n<orders>
I0 d( D$ r. g% P+ w1 ]% F- {3 a6 r+ d( x
<order>2 \, w8 o! v/ G: d
, f0 k, a+ V. o! c( t- l# _8 v
<customerid limit="1000">12341</customerid>
) A9 N2 l- l+ _, N0 k2 U0 E- v1 W# A* p' ?/ W" B8 p
<status>pending</status>
( U$ Z& C" g9 j/ n. l' q7 V6 u4 y* N4 _" E1 E+ `& b
<item instock="Y" itemid="SA15">
' m; S) r6 k0 C2 X+ j$ \
3 a# J, Q. O7 b6 c6 t2 V <name>Silver Show Saddle, 16 inch</name>
5 X# u7 x$ s \9 u! o+ L
6 V+ K, D( ^, w) [ <price>825.00</price>
% Z @+ Y6 v, i; v# G; Y7 N: _% E5 U4 G7 u5 m3 ?
<qty>1</qty>) Z, I1 A! f2 q9 T2 K+ C
/ Z' V: \& M+ \2 |4 C
</item>" H" N# j q( @) q7 S/ C
7 G" f4 c8 u6 a6 V- m) M" L( g
<item instock="N" itemid="C49">
' B# k" f/ X4 A y. t. D- j! j8 R8 j- y' X
<name>;Premium Cinch</name>9 Y3 H( a' p0 t9 n8 u
5 J; e' t2 y2 O2 ~; P* p) `( z <price>49.00</price>
( ~4 x2 a3 t X2 i+ w- j8 v1 p* ~$ J. r5 l. U4 d
<qty>1</qty>
) r: f. A* @6 x
8 `4 V4 L p0 j7 Y& C3 D </item>' K. M8 X; D7 r; f( U
7 ~6 x! g7 t: k5 p! F O9 C* P1 D
</order>/ ~, O. d3 l+ F
) B2 p) e6 D- H, f" K" j4 \
<order>
6 Y* _1 ]: q; J1 {
, {- x7 H8 v' t <customerid limit="150">251222</customerid>
% ]/ @0 L! [7 ~0 ]9 i& \: B" e7 P x! n
<status>pending</status>
. B0 k8 T+ r8 Y
2 e: l5 f2 L$ B2 V+ u, A% n! } <item instock="Y" itemid="WB78">
& b5 [( D0 k: A4 w- P, w) t0 v0 T# q8 H4 R+ t% ]
<name>Winter Blanket (78 inch)</name>
; j2 t7 B$ l3 f- G, A# u. s, _) z/ L( h( c) |
<price>20</price>
* \7 s+ _4 H. [- i1 g) Q7 u; k
# ?+ S6 |$ h9 ?3 ? <qty>10</qty>
7 O4 Q5 e3 Q7 T/ b' D$ p8 S+ i5 o$ x# W* A! Z$ A
</item>/ C5 k# @4 c, l2 b+ b: E9 E# K9 i
3 O. l$ g7 r* J# U7 n# H
</order>3 D+ @& B6 m) z) P
7 z& U" n3 f+ @# w, s</orders>
7 y# F& N' d9 }+ m) e- \. U在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|