|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
3 S7 ~) c- x" a4 W& p9 m) }' J. v
开放分类: 互连网、网页制作、web技术6 i3 K, h+ D# P% R
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
+ W5 R2 \( ]+ k6 t( K7 P, S6 k1 Q t# ?( X" z# F
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
! J* X( E6 T: d; x' H8 V! r
% k, A1 X/ }- Y对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。9 f5 g. q- S' g: ^7 r
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
! u) T- W0 Z: l1 ]1 B! |- ~+ [# K2 m. G' I, g( J
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
0 x1 Y/ k: U" A& E& l7 D& i& }9 E% C/ ?
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。6 k+ `% ?+ L3 u2 ]. \' B
0 Z6 R4 Q) D/ ~( \& y作为 API 的 DOM5 h5 S' U! N8 d7 n
! `% T9 K4 l1 ]0 ?- v从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。8 a9 N& ]9 x8 e2 {$ Y
; u9 S% I( s) F6 U" a% a. j
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。# Q8 r6 |* |! s7 T3 n4 s% E% ?
/ Z" j6 o7 F& Y$ ^- c4 J7 cDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。# _, `! |6 ?, l R
3 g8 c; z6 s. F: \* z; V当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。8 v Z1 n2 \$ s" A/ V8 P. N- d3 V
- F" {, j7 @5 X7 W7 o% @7 x- }; RDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
" N/ a8 e4 u; O, w! }' p* T2 m/ K8 G& \! ~; ]( |7 u6 j
确定特性可用性
. @' o1 \( t; f, j8 i# P
6 }/ I! a( \( UDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。3 a1 T. d' m% U
9 @, q/ b0 V. N. b. E4 ]: ~
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。9 E( ~. K; G7 z" x2 w
, p( _% m0 ^5 k! M
import javax.xml.parsers.DocumentBuilderFactory; ^+ |2 B' c/ \9 M2 a" O
4 G1 z) {! S4 k1 Z; P+ g. N r
import javax.xml.parsers.DocumentBuilder;
6 F5 @& e- m- A/ a: ? F/ [% c9 T. B
import org.w3c.dom.DOMImplementation;: ^! r2 n) a* }9 H% o
% a1 O- j/ _, p$ gpublic class ShowDomImpl { T- G W4 N+ S5 \0 x: M6 j
2 e) L, @8 {, epublic static void main (String args[]) {
z( M8 X5 E0 q! d7 I) M
3 y( A0 E0 G- ]+ Z( Ctry {0 h6 R! S# i$ i& U
6 z9 J0 u4 p/ Q1 n; e0 j9 y& M) z
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();- p0 g8 F/ }$ O: p0 p3 I
; h* H- q; Y5 k6 j6 ^! |
DocumentBuilder docb = dbf.newDocumentBuilder();
1 b4 |0 \0 P+ |& s! U. o1 M
. \8 Z( N4 H2 q) [0 @DOMImplementation domImpl = docb.getDOMImplementation();8 e! `6 a2 g! {; s2 ~# s. S
+ h1 ~/ A0 H7 y+ x% p: eif (domImpl.hasFeature("StyleSheets", "2.0")) { O2 x' l- A; ?$ v( z
. ^6 w9 u4 a- z% W3 q2 T
System.out.println("Style Sheets are supported.");6 D, k2 k' G9 [
1 J; k. l7 C* Z# n% `9 @
} else {
3 L4 ~; c K0 `5 C5 d( x2 w! _: F3 v4 B' h( [
System.out.println("Style Sheets are not supported.");+ d. K5 B3 E% n, ?5 P
7 x0 p& \" W! l& t+ h- z
}
! y+ ~/ v5 r0 b; N) w; `0 k" ~( w! C6 O, _- ?$ {
} catch (Exception e) {}7 |- @8 n- ~* L4 S
W r" u* o# e
}. u6 \2 T" [& c1 @! c# d
$ m5 M) E" r! W5 G; w- H}
6 i. _$ ]/ {- l
% E! e x# G2 {1 N& a0 N/ q(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
. K- g6 m1 q/ X- h3 y1 V. P0 g$ C% J& V1 Z5 k* g( j: n3 d
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
Q2 c" `( \+ m* {# z+ d) B& ~! L# U0 m0 k) b E
基本的 XML 文件
3 i+ v9 c: W( n0 i9 m3 ], N
$ U$ D5 f/ \+ X$ ]4 [+ [本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:! ]1 Y1 e5 C) f5 a. z
8 E# s3 k0 j) A; JXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
2 u. v2 ]( K9 C, e0 G
7 t# b0 E h" XDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。- s6 n. h7 A6 q, o& J
- P3 C) [/ w! \- _
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。. A: _ F! U- Y# U
/ f- N" K _; }8 K0 U<?xml version="1.0" encoding="UTF-8"?>
9 ^( D3 C5 l& X2 f0 h
' U b2 I" }) a<!DOCTYPE ORDERS SYSTEM "orders.dtd">! J$ X& q6 F2 T+ _7 Z% n% O
8 a5 @# B" K# n. \* v5 Y5 @<orders>$ a. y) x( ]$ b* V
4 B( |1 l6 o( Q7 t9 S% Q <order>
6 B& P+ K6 ?1 H, m8 |7 B2 d& n5 P; Z1 y# u) c
<customerid limit="1000">12341</customerid>
6 U, ?& D/ ]& N3 c% f; t" E, g" G6 B5 G. B
<status>pending</status>
' a3 J; b1 q! u& E! A
" m4 @! ^+ V2 {1 G& { <item instock="Y" itemid="SA15">
9 I3 v, {. L9 P0 y7 S
! u" t* J4 f4 J: m* w <name>Silver Show Saddle, 16 inch</name>- n5 Z* M, p8 a, T2 R7 ~
5 g- }0 R6 K2 i5 Z6 e0 O <price>825.00</price>8 I: ~+ q) h2 t) [, W& p. `
/ R8 x5 O! l$ m! l' A
<qty>1</qty>: G. S, H X7 {+ G+ P5 G
5 g5 t2 x# A7 J& T1 \6 L </item>0 n7 A2 ?2 ]7 ^, H7 T
7 x! c* C9 l1 M6 i( ~- C
<item instock="N" itemid="C49">
& r- R. l! w2 A2 ]( W! T. v1 r( w0 k( e' q! q! F
<name>;Premium Cinch</name>
% w9 q) ?3 H! a9 h3 O2 i1 v4 s( A& j: h* S; L) v" H( h% P
<price>49.00</price>) I4 T+ v" i0 l0 [* H1 D) X
2 _* e: f7 M/ q3 o- N3 y. c <qty>1</qty>
8 U7 e+ d- x1 X0 z# S
: c& M1 J6 G* s- j# W4 [* k </item>
* E. I7 G$ ]) L' M$ s
& m% q$ P) H. j% R" r- j4 k* k# \& U </order>
" V# O+ G+ `$ L& p5 H6 e P2 ? [5 M O0 r, V& Z. _$ h
<order>" v" t7 F# V; R6 B. k
& F/ {" e3 j- e+ O/ m$ m2 ? <customerid limit="150">251222</customerid>
+ j; [& T0 V- h( q4 h( _5 f1 e6 F0 W6 p6 _0 A9 ^. t
<status>pending</status>
% S2 k ]- t$ k! p6 b( B0 V+ s; V o. O5 o* v6 m7 w. g
<item instock="Y" itemid="WB78">
0 Z6 Z; V& }4 a3 E, q! I$ U9 F. ^6 ?, ?
<name>Winter Blanket (78 inch)</name>2 ~* J! }+ P6 j
$ g$ k# p& W5 _6 d: [
<price>20</price>2 x$ O% f' A4 Y- U: S$ {6 M
7 y) e+ j9 a( h. k( R/ q
<qty>10</qty>
( `* Y$ s9 f) z8 s7 `
+ U/ K( }/ O' m </item>% K/ Q7 K) X# t4 P- C
6 l% S/ G4 B# W% G) T</order>7 j" R& ~' [ ^# {1 a
3 u1 ]- }5 N+ m+ ]! H# Q
</orders>$ w; H& S2 t: Q) ~+ r- j& h. w$ q* {
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|