|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
6 s6 o2 J- D: r$ I7 A2 |5 Y
开放分类: 互连网、网页制作、web技术; Z# ?( c- X% _2 C5 i# G
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
4 t# t) R* V( i, R( t# d% h6 _3 m- {& O" ]- D- S( c4 i8 y7 }
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。! S' j$ ?1 H# `+ R
, `# n( E4 f. w' I% L8 C对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
9 y5 f* B, b* G7 T) }SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。. } T& Q( m. U* N2 g/ e$ s
_6 `5 V5 q! Y3 y3 v# n' H7 R另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段6 \! R& ?" R" \( r( u: j+ V- f9 \
; c' x8 e4 Z# u; z, h' O4 I解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
# `) R4 t/ P \8 U, P+ Q+ a% D( ]" g2 R- e! k+ K
作为 API 的 DOM& I6 j6 @9 M. r5 O+ l; d6 C
5 d% [0 j3 i9 e7 h# ~2 i& C
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。% ]$ y7 c" m! I8 w- n+ y
" ^+ v+ e# p) Q' p
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
& q3 E7 {' f% R+ F
/ x: \4 p C3 }* A2 C" Y5 ZDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
0 G |! }- n% f8 M! f- u* r+ I% y7 M
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。+ D$ N; Z# q% ^% { }# q5 _8 q
4 p& Q6 @9 w3 x7 @5 T( ]9 i bDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。* i' B/ ^1 N5 @) @9 i# F" V
0 @0 [4 T: ^4 e4 @% ?- y" o
确定特性可用性! b: R9 J! H; _* }0 z& l- }2 q% \, ~
7 U$ i" O( e; C/ `% K
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。" ?- f: u9 f" d+ x! X" s
# {9 o8 W( P# F. j, yDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。6 [6 }& U+ M# L
; t3 I8 P$ }. I8 a- u
import javax.xml.parsers.DocumentBuilderFactory;- ?. s, l: M& U0 m- \8 o) z. P
% `% Q0 _6 S& M! w+ ?import javax.xml.parsers.DocumentBuilder;
$ Y3 k8 o& F0 R' o/ u' C& h
7 J( }; [' D4 w, a+ r7 L3 i8 simport org.w3c.dom.DOMImplementation;5 r* Q) p) G: I6 o; ?% g: J* B
& A+ j% U3 R, k l! _5 E0 j! r
public class ShowDomImpl {
( a6 C6 a( s5 I2 d" K4 m6 d) f5 [4 B5 f0 R5 |/ \! W# m- d& D P: T) f
public static void main (String args[]) {
/ o4 i9 y f& D7 b5 U9 }* _ C
, X: W- |7 u4 e Vtry {7 f4 G1 b: O( u+ j
5 n# [3 u2 Y6 w5 \; r3 u$ `DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
, T& N1 }7 l9 M+ Y5 P9 s1 V
! D# {& C( m: kDocumentBuilder docb = dbf.newDocumentBuilder();% O* M) C- t" q. h3 Q4 @8 @
) E7 `( }: `1 B: ^ V4 IDOMImplementation domImpl = docb.getDOMImplementation();
' R' D. I7 [7 R S
5 [- z7 Z/ C6 r# W; m9 `6 xif (domImpl.hasFeature("StyleSheets", "2.0")) {
8 n8 z1 N# `6 q( T9 U! I1 y# _& Z+ b+ {7 [, }8 T" k
System.out.println("Style Sheets are supported.");2 T/ V0 a3 U' I/ v
, G. f% Z. s6 z( c( Q} else {
4 {1 I* J) ^9 L8 L& a
0 ^9 a* c# u# N0 W% T! C6 |! @System.out.println("Style Sheets are not supported.");
, f3 m2 N6 F0 `( p' l0 U* O6 D7 e% P- |2 w7 `* r+ r- Y" N
}* r- Z* T# {. I% _! P C
/ K! N/ g. }( x/ x# G6 Q# T
} catch (Exception e) {}% y" j$ Y. g9 B' a9 \
: Z6 \7 l& E; h. E3 u: n( F
}
4 b: s, e- u3 o, X" n5 q$ H, g: ^; i5 m# r2 h2 y2 M
}
! `4 a" B" G/ s2 F, A$ E" F. G4 Q" c/ e/ m+ p3 ~+ Y
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)" M* R/ m4 g% G4 |6 h7 {/ O) m F
9 s6 P2 D0 o% I" f; H% D本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。 I; i4 n) F& b: ~) D+ I" d5 Q
& r% R8 Q3 T' j& o" S基本的 XML 文件
& r6 k4 ^' d& `! M
6 z O( @: v2 B1 S8 y% b本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:4 e+ q3 y, _5 P. j, N* V0 @8 n
; K' G. B; n& m9 e$ BXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
* W+ B4 {/ }# `6 h; Z' F/ I
. q" A7 }/ Q( s+ }6 ADOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。. q2 |& _5 M. P; b9 f
: q; {5 n* W+ _/ m/ y数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
' q4 @6 @# c# k4 W5 K
. ?: i1 x4 T" f3 ^<?xml version="1.0" encoding="UTF-8"?>
9 P4 E. J. T% L0 C4 G0 H2 o j7 ?
2 F( I0 P# T7 d8 H% T, K' f/ O8 y<!DOCTYPE ORDERS SYSTEM "orders.dtd">' S% O4 s* s2 X$ j
' J6 y( _) z$ g! _1 k
<orders>
) \2 O3 ? \9 h& F/ l) [
0 i& i3 o) e4 t2 M2 v$ K <order>
, ~7 |6 s0 U1 J
; I8 T0 [( \! e/ @) R2 [0 S <customerid limit="1000">12341</customerid>
" s6 z" h& }8 N' K4 X2 h& T6 h/ U, V* y9 p9 K# q, X ^
<status>pending</status>* x9 W' \1 Y1 R8 J/ X4 v0 P, @
8 e6 k# W. S1 S! R4 I* l1 s
<item instock="Y" itemid="SA15">+ y+ [& q4 S) ^$ g# H5 N% K
s7 A" `( u: O <name>Silver Show Saddle, 16 inch</name>& n2 c- K9 v0 J- o9 L
" Z4 ^7 g5 e* i T
<price>825.00</price>
( |9 m8 N6 W2 F3 L2 i/ d
& y& W( y G$ s" p- P Z% ~: z <qty>1</qty># ?5 ?9 T. M G" a9 ?
+ U; e9 ?9 W% t* a3 k- V2 C
</item>
}7 H! f% P$ o6 U
7 N# _; v9 r3 L) }, K+ ?0 H <item instock="N" itemid="C49">
9 I" }9 w! u: Z2 ?
7 Q/ t" H9 E, W <name>;Premium Cinch</name>
1 C4 t/ P+ j$ T- x) A8 ~
7 Y1 x3 h( o2 P5 M, D <price>49.00</price>
4 u3 A3 s; K8 F( W
9 R5 S8 @& ~: a0 D. \! G <qty>1</qty>
$ i/ h$ z1 l- K9 V& n8 s! W& q0 v2 H' E4 r' U( i5 Z4 U
</item>
- y0 d; e& A; A/ C: k; P& P2 _1 E# H! j* w, P) |& D! U5 \; D" A. G
</order>2 W. D: P& Y8 _2 f
5 U- E7 x- S" M& ~
<order>
4 }- {" a* e( B. O; _0 u- u& \3 e
/ C! S; @( L; x <customerid limit="150">251222</customerid>
. i/ w1 ?0 m, h, t- W6 F, Z
0 ?2 N( I5 h e5 Z( m4 G8 K <status>pending</status>6 X) n; k/ w3 M; u, Y" g# \+ [
% m# M" @. g9 [
<item instock="Y" itemid="WB78">+ ? C: }7 A: |6 ~/ n6 \
) o1 T+ J! R; P8 k
<name>Winter Blanket (78 inch)</name>
6 F! T% K* O6 i) @, x- p8 Q/ \4 j& ]6 L& |5 }
<price>20</price> P: j' H; @6 r% I. h+ ]
1 G9 ^$ G' ?3 j9 O' t8 P0 V( u+ m <qty>10</qty>
# h- I' G! Q) |3 F' i- F7 }
A4 ?6 n# p. a3 l! E </item>
* Q9 z# c% h8 L u3 v
* B K) e9 g# w' b6 N0 y) e</order>/ _' t% c! m! r
3 Z( C) h( L7 T* {' E
</orders>
0 d& O# w* w2 D, N3 s* Q0 _在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|