|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
: I! }# \# x* U, b8 d开放分类: 互连网、网页制作、web技术
- `" P [( _" ?. LDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
+ e' Z) @& @9 e/ r: o' S6 n' y, J0 @" P
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
0 [; `& L$ z# S: k D. r. M5 j1 O" C* j$ \
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。, q+ m* N' h% G7 d. a
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
5 l/ l/ e% g# T- Q/ K1 U. O
" u/ E1 d( _$ G' N9 i4 U7 E* z另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
, ]( J% z2 L. n
1 u# O( z d* |/ U& l解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。( W5 m: K; z# e' _! |9 e" g
! Z; y& S( {- S0 C" d9 T/ T+ X4 m作为 API 的 DOM
) y- X$ V0 x# w5 ^/ X* s
5 x$ N- k6 O% f! u9 \0 t! f从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。- K8 c& T/ Y4 n5 x$ F
# v6 @" s! v) ]7 x4 R4 O- P0 n/ rLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
. `; ?2 I9 o4 v; K6 V3 c' f0 k k' T3 J4 o$ _ F
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。" G: [3 S, h% P' s& A: H
: U- B) ~4 p7 P2 t. p4 T/ o
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。3 }: {: Z7 ~1 G' U
5 y; ?& q' l S! i1 HDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。; B4 e. C ]5 S. t: Q- J% _+ j0 @
9 w/ j5 X/ D' o! h5 v$ P$ }
确定特性可用性( Z; j c6 @7 n6 j' H8 L- o9 ]
. H7 i$ q% l- N- T, T" C* D
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。5 j) u3 P- {. u" a
& K. n: s2 B! S0 rDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
" ?# T P& E- B, _" O! g- Z- ~! L8 }5 c3 H
import javax.xml.parsers.DocumentBuilderFactory;- U: T) O+ D& u+ X; a1 M8 t" k' ~
4 S4 ^" M6 f- v9 ]. t
import javax.xml.parsers.DocumentBuilder;, o' ?- G5 D3 W) l# D* ]2 T
' I2 P/ a8 q( v; h8 I
import org.w3c.dom.DOMImplementation;0 y" S0 i, Z V7 Y, Y! o
! y2 \* M* B) x$ }7 k' g3 m' h) I+ Lpublic class ShowDomImpl {6 S* q( A: N7 m" U7 E/ c
" t* x" U( X+ a$ `
public static void main (String args[]) {
* o, Y6 ~2 w0 J3 H2 t8 T$ \; l' r+ X1 T# s/ R& L
try {
' S5 Q5 O/ ^7 X1 U4 Y5 [7 `) v1 y F- e0 C& x9 }
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();& H. t* M% H U# W4 [. d
# y# `! q3 E# U4 {, E* hDocumentBuilder docb = dbf.newDocumentBuilder();
4 V3 t2 ]; b4 W) Y+ t; `9 X+ M% y7 n6 X% |% x" K& b
DOMImplementation domImpl = docb.getDOMImplementation();
S6 v) K$ [' B0 w, @
4 F m9 u8 o/ ~: @: }& |. _if (domImpl.hasFeature("StyleSheets", "2.0")) {
) E$ K/ E* x9 R# z- b0 ] o* ?) i" V- P1 ?( {- m
System.out.println("Style Sheets are supported.");: b2 Z4 j! u/ x0 |& S
5 A B. d' v" b x1 @# q5 Z} else {: P4 r, u4 D9 Y/ U* }- r
1 C: w! {, w) l
System.out.println("Style Sheets are not supported.");$ ]% e" l/ K4 c6 u! ~' |/ E$ O
- h+ Z( B% K1 Y+ G
}
1 ^& K6 {. e6 C8 u! _/ ^7 Q+ h' c
} catch (Exception e) {} p j4 q1 A7 u) ]$ O5 m
# W, B! s- x8 C+ ]" g0 e/ K
}' x, G* _" y- b
8 c5 P( t) d1 z5 f- h! r( k5 o. O
}
9 Y$ k0 s# S9 p, r( E/ |* a0 z
}& ~# `* c7 O4 n4 v* [(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
* n9 n) a M. m6 g7 d) A2 c5 U2 ~
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
+ x; b. P: \2 `) }" R, O8 l6 ~7 n
3 n4 K5 k& `: Q基本的 XML 文件
( d k$ X, k( M. h. U( z' T3 S6 y$ o+ T2 [+ ~! S g, Y
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
+ p% w4 [6 H& n( _
# F; O0 a1 [, I- S) hXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。+ l! V& @* @# I6 @5 U/ T4 M# o$ @
2 a, T9 R, P; H
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。/ ~/ C7 B- C) j. s# t
' z4 H1 [! }* H/ Z6 z数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。, A# D/ u" y h, G4 t
2 n! C2 D% p, s) O& v1 ~9 c" g
<?xml version="1.0" encoding="UTF-8"?>9 J0 @/ v$ L/ n' f' ?! N z
5 t3 W: D1 o; P- j* F( X! I% x<!DOCTYPE ORDERS SYSTEM "orders.dtd">6 F. f( O4 j/ U0 A/ j9 a- F1 P
" {( Y' s/ s3 P
<orders>8 \ }! L% p% [1 X6 V* f; T6 b
7 B2 |" ?; m# i, j& k3 S
<order>% _3 I& u( \4 ^& R: {
, d& \7 @0 R, q5 I <customerid limit="1000">12341</customerid>
1 L, N7 D' y. [, y( L# n9 n! S
) }0 U" {* Q+ \# p3 ?, | <status>pending</status>: U4 _! Y7 p% C3 N. ]4 L5 L0 `
Y) _4 W' E3 P1 q
<item instock="Y" itemid="SA15">
1 e: k: k4 _' B( j% E
! `8 \) |4 ?" {; c <name>Silver Show Saddle, 16 inch</name>
2 Y }" b* ~' \5 Y1 @+ y. L5 s3 |- ~, E+ \6 ]5 a
<price>825.00</price>2 @3 n2 J( E+ ?* C
8 O" j. ?% I; z% n4 _7 ? <qty>1</qty>3 S/ h- ]: }- n$ p1 K/ o
, `" S. ~. I0 Z0 C/ s" d# b
</item># d+ f( W6 |5 I2 U3 F
( t& n" V9 A* N; K. r
<item instock="N" itemid="C49"> a3 u/ E3 s0 k$ R! K
. v. N7 A0 x9 z9 d <name>;Premium Cinch</name>+ Q/ M4 n) W3 Y3 I% M
4 ]( Y$ q, ^) q- H <price>49.00</price>4 C0 E' A! j' _& H; `* y" i7 n
% q% Y t; |1 }% j <qty>1</qty>; l& } p% a5 M2 P1 X# I9 @
" C! [7 L+ X$ g/ l( l$ l% O& A </item>( r' k6 S- t$ ?+ z4 x! [' n
5 o* F$ \2 n9 j0 f
</order>$ Q3 T0 D/ ^$ ^% W
4 t6 B. K" B/ s<order>
% |. K! j7 e3 X7 E; ~- v, P! U2 N, b! j+ a5 n( p& M D
<customerid limit="150">251222</customerid>
+ B3 Q2 R8 d3 {, C. E
1 [. S [+ {9 ] o ? <status>pending</status>
4 N! r4 e/ W! f9 P7 c& \6 ^7 h& T
; i2 g5 R3 f8 F8 c, _( ?0 K <item instock="Y" itemid="WB78">
* _ ?% z/ X7 \$ B. R2 L7 x9 x* T% ~
3 _$ ^7 Q7 Q" Z ~) x <name>Winter Blanket (78 inch)</name>! s. ^! S& K8 C1 C0 `! l/ v- F& H
8 S0 W) b* Z3 g4 N <price>20</price>
4 E& j. A* `; T$ o/ [4 a
5 h( Y/ D& _. K <qty>10</qty>
# P1 A& h6 C; k0 N, w9 r
+ @/ {# Q5 O% W </item>
w( L. k. y6 F4 m+ n+ Z5 }+ R' f- @. J% F+ p/ I5 N! ~- Z
</order> b0 C0 J0 O, v4 n, F1 N- X
4 N! C: O1 {* M0 ^5 r: J9 a; a</orders>
- f8 C% `) E" V; S7 u在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|