|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
1 R3 e! }- `$ i9 A5 j开放分类: 互连网、网页制作、web技术+ K7 J4 _6 M( ]9 I8 V3 N
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
( P' d' U( @4 C3 T2 j/ L
* p) Z X6 y, }+ JDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
! p4 E9 I( z% B" o: n
u6 _/ ^- V e" U5 K: w: u/ b对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。1 l+ {$ W1 _7 \ s5 ?
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。; a1 I+ K i9 O& u; y! Q
+ A7 }5 ^- B9 G
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
7 w& ], y1 \' v- \, q. A
, T, Y4 R3 ^3 R* @: O' D# I解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。( r( R" j( y1 M( o! R( i( N
S6 b) r# n7 N# G w作为 API 的 DOM4 r# P1 G5 q. Z- I+ o" y; ]; I
0 ^& u: S& F- k/ ^) ?) H5 U0 ?; c从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。 y3 C9 i. h' i0 k f
7 g0 ^6 A9 `0 z3 _1 O( q; K
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
3 R: q- t1 z2 Y/ Z3 u. \$ O+ I) T* U- M" g
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
* C0 o- V8 s" s& ]! e- E$ q
# ?8 a+ {0 b( l3 K8 E. J9 M当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
% S$ \4 b! G9 [6 D4 ?/ `7 [, C& _! S# n3 S7 H$ B
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
4 K$ e3 N) J2 B! D$ ^, }
9 |) ?+ W, E( ~( J* k: Q3 d确定特性可用性
& Z1 s8 D3 a" L, u& s# Z; J. R8 R# T# u
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。: j$ C; {' @' m) ^
]2 ?3 {3 Z. Z5 j9 n+ E1 c* pDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。$ ~2 m R: u. |
' m1 p7 K3 i- I5 eimport javax.xml.parsers.DocumentBuilderFactory;
( E( h: i ?% Z Y+ s. t* D; X% r
4 T* m* z3 M/ @! Himport javax.xml.parsers.DocumentBuilder;
; z% k2 I9 H5 n9 Q' y
+ ]9 `2 y+ l! h" z" `import org.w3c.dom.DOMImplementation;
' {8 ^5 c ~. u* x: x& U2 ~" M/ C. Q) l
public class ShowDomImpl {1 E; C. T" I- `, B$ ]
3 V5 V* B% P8 h3 h$ ]. v3 g9 V2 apublic static void main (String args[]) {
" e3 o% Z2 Y- @$ N. Q! ^- n0 F
, P q# x) J: o# B& u. btry {) `4 }1 b$ y/ D' c
1 v; h2 R! k, t( m0 B8 M x
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();0 p: @3 u. }. a. {; ?3 J! t' O
4 |0 m1 e! ?7 K2 Q4 g: g4 O. i- U
DocumentBuilder docb = dbf.newDocumentBuilder();' @8 e1 K7 J; k9 U- ^* D( p
C6 |$ L1 X( t7 B
DOMImplementation domImpl = docb.getDOMImplementation();. c, q6 e9 l5 B3 N' j N" O
( z& V+ a$ i1 l( Oif (domImpl.hasFeature("StyleSheets", "2.0")) {$ d/ _1 a1 K8 @
# O* j0 o4 ]- E$ q1 r& Y
System.out.println("Style Sheets are supported.");9 v6 \/ t) C1 k2 V, y3 N" M, t1 u
: P* R) K6 E9 C} else {
! I. j/ o. V1 X# j5 `# x5 R" B5 f3 J% M! r- P! R6 J5 O1 h
System.out.println("Style Sheets are not supported.");
. L$ A+ ?! Q3 Y' F* b' s+ g9 k' n D, E o6 V2 v3 J: B
}7 e8 ^, F5 d- k3 P! o
# y& _6 d! [8 D; n2 ]' N. [- O} catch (Exception e) {}
3 C0 m1 w; A/ ^) h% i" Y! h9 z: f0 D- T
}! B' a2 t2 [" |% `) B5 V
) y! B8 [/ e- a. `
}
# e5 J+ M" g' T5 |- ?
: a3 D4 c4 Y4 F5 Z) I6 a(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
2 U6 k: z- R* X# j+ I; `- h. M4 M) N8 c5 A5 [
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
! C; z% j& d5 k0 L9 l: T L+ f' v* u
基本的 XML 文件
: Y6 V9 ^6 M; d/ ^ Z& n8 a% d8 b1 ]$ x- o, Q) P
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:" f8 [! }: T I$ w, y. T
+ Z% o1 g" ^ U) J- U7 A/ q
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。9 G: p; E$ N ]9 {- n3 B6 @
. d$ O- O }0 O3 m7 Z( {6 u
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。, y \+ |# m, g# K/ d1 b
, W6 @( M2 b" c9 @9 Y `
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。1 A# y! G- O5 E f; Y0 j2 P
) E0 \6 b* @$ l<?xml version="1.0" encoding="UTF-8"?>8 J8 M, H4 z0 S- R- v2 B5 n6 g9 _
3 j d. F: T0 \5 l' K<!DOCTYPE ORDERS SYSTEM "orders.dtd">
' w; ~9 r* }( e; Y) Y, j. ^
" ~* v( T; D8 G P5 L1 h/ {$ I<orders>
! ~, D# c- w, T1 O4 z! a2 u
2 q0 c2 j8 D0 N5 V H <order>
4 M6 j$ u; I: c& A+ Y
8 k& y% ~$ x& ~' W <customerid limit="1000">12341</customerid>
1 A; A: a6 |8 b ?1 J( q6 M7 a8 N c7 |( @
<status>pending</status>6 R! F$ m* S/ n* A) T
6 L! {. p4 }: |7 d <item instock="Y" itemid="SA15">
% `& t& V) s& b1 y: B
' V/ X) _! s( d v, v' X( [ <name>Silver Show Saddle, 16 inch</name>
8 m6 @& ]* W+ p* F$ E6 z! D: o' A
<price>825.00</price>
! ^" S% U: |6 B$ N+ e: S w b" w1 H. L. j8 q
<qty>1</qty>
+ T( G. A1 n8 s5 C) }
% J% E8 r" l7 f. v: e </item>2 C; E+ `: A5 Q8 J2 O) F5 Q
$ ]4 N: c) p! ?0 c9 A% @& H) ]
<item instock="N" itemid="C49">5 J6 V0 T/ h. J: h0 Y
3 ~8 W( w! r0 k <name>;Premium Cinch</name>, n' M5 `6 D0 Q
2 N+ `/ g4 {( u- A
<price>49.00</price>
1 E0 l0 z' f- z) b; r+ A( {: [
0 |: p4 P7 |3 M$ N <qty>1</qty>
4 Z/ S( T" e( T v$ K$ K2 K* H; k! l' @7 Z- _
</item>2 B! i8 c3 _5 _6 V
/ F' `( ?4 p3 _$ D
</order>/ u0 J- _! z1 s* X$ c2 v. K1 Z1 M
: j ~8 A% p2 B<order>& P5 y4 F, {6 P% C/ d; `3 z2 {
7 q/ h4 k) V! t8 M; E
<customerid limit="150">251222</customerid>
9 C6 r6 A/ K- d% Y0 d3 p- ?- ?
<status>pending</status>, p8 {+ @0 _/ D+ o' s8 \
6 V4 w D& b4 R) g
<item instock="Y" itemid="WB78">
5 I' A1 T" |% P+ n! X
4 Y6 P# D7 P1 U$ f <name>Winter Blanket (78 inch)</name>
5 V& D, z/ [$ p/ `* b
) d: S9 t) o W$ A* O- G7 C) n! {" P <price>20</price>9 y. q9 f6 i; G1 b' P
; ?: b2 \+ G/ J2 l( c# h
<qty>10</qty>
& ~" E c9 _) e
5 G# m8 T$ h4 f; ?, I4 o' z, ~, N </item>
% g& Z2 n+ o* ]% M# w1 v; s! @4 f7 }- y
</order>
: e2 z+ O- i. c* f2 I w# G) [7 I2 p- U2 c- [7 A! U* ]3 E, L2 ]4 \
</orders>
- @' ^! C, x" F) j, r& D$ X0 O在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|