  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
3 q# W2 F: {8 ~( ~+ F开放分类: 互连网、网页制作、web技术
8 t3 v6 U* b, y4 LDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
8 Q7 A* }# f F9 ]( r9 j; U6 N" u$ c( ^. K( Y& {
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。" {: ?- T ?8 Q9 p1 z+ x
! C' f- y$ z. p" r+ ~3 p% Z对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。: i2 B( k2 Y8 p" D. h/ Y% g8 Q
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。# u% O7 Z7 \. M4 \
# c4 R \2 d `. `. F* g另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段, b+ j% v6 e; ~; E" {+ I
" m/ e% K F C# U% @
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。: n7 Z* {" c% Y
8 h, c& L% i& u& G$ X. g7 o
作为 API 的 DOM
4 Q- v# r O5 y4 C8 }& |- n2 D% m- H5 q
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
% P5 I' n0 y% ?' ^/ g/ U( A# U1 [, f( O
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
, ?0 K8 F6 `6 `- I4 y: l; \! W4 L( Z2 b" s- E
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
: S$ h! f$ k. `1 o6 M* M
' o) S5 c- [; q' E( n$ {8 ?当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
* R" m+ Y3 N# r) n- t* N1 w% F! t: O/ F9 o# T2 [: m
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
) ?. E# V$ m _9 I2 V( C+ e
; c1 W2 u2 _3 N; {! z* { _% Q确定特性可用性- [( x S: R) T2 z1 P* `: D: M
' a; X( H; N+ R7 ~0 f& @DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。" @+ K% Q8 n4 K/ P6 h
" a' k. G8 q0 |' B9 m3 gDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。( x9 a/ {! h/ I4 }3 a; Q! Z* d
4 i1 S" g5 ~/ `; Z9 U) G$ }. Kimport javax.xml.parsers.DocumentBuilderFactory;2 c, @$ B: N6 q2 G: g% Q7 F
7 z8 ]" S% q( Y- b+ Z9 I
import javax.xml.parsers.DocumentBuilder;! C( S. U5 Y3 o8 G. m
6 m+ H% ~, ]) r: _( uimport org.w3c.dom.DOMImplementation;7 r( l% {8 C; K8 _* r
! M- o& O6 f' u
public class ShowDomImpl {
+ `3 V* V/ g( M$ B5 ]% |9 o
+ Y8 @9 ]0 Y9 [6 D' A$ V! D: ?$ epublic static void main (String args[]) {) o P3 e; x7 i9 r4 L
" z p( X( X, \2 m& l9 O3 _
try {
. L' G B1 }* x6 i0 R
9 D8 z' Q: I$ u9 C; M `( N; G/ JDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();' q0 T. d9 V7 J7 ?1 l2 V
. \" S; p, x0 k, ]
DocumentBuilder docb = dbf.newDocumentBuilder();
6 q. w. g) p% j- m3 U) x) ?# t; s' }/ Y/ [0 P3 H+ h" | \* J9 y5 l
DOMImplementation domImpl = docb.getDOMImplementation();
7 v# h/ D. b; q8 B& h/ e8 x; o, @* u: F, {. U, W, n* E+ P
if (domImpl.hasFeature("StyleSheets", "2.0")) {
3 z! I$ ~$ J3 |* F H+ d: p/ u! I
3 L% w4 @8 g8 q- ^& w/ b( k0 y- WSystem.out.println("Style Sheets are supported.");
8 W- @* P% f- m' O( K
& {$ C! L! m H H} else {
9 [! F3 L7 Q) ?9 U7 H1 f O
6 a% R3 a" J5 t5 d1 y" o9 t- ZSystem.out.println("Style Sheets are not supported.");& Y! {. Y$ z. {4 |+ p
- e5 g7 t) V8 X7 x+ l7 g
}6 E1 D7 Y: {+ b& l+ @" z
: c+ U7 O* S' ]0 @
} catch (Exception e) {}
* |( H7 J( [: R$ I. M! {
0 H v0 g* h. `# ~! U' g}" ~8 O# I4 G6 |
& d" L; b% w' x/ m. g0 C, o8 b
}
: G1 |7 s- X# i# L/ x
( F# Z; r5 F/ \; w8 O5 p9 [9 K(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
- Y& O: X9 H0 ] U+ c- p
& [+ i |# z% y! E) d3 H本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
7 \- Z( M! _3 F- l& D
) ~) x" t, j) C, d基本的 XML 文件, x+ t# O& Q5 q1 N
' ]. A; q- g- y a$ Y6 g. V本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:' o6 v6 a5 i) N
& V" u6 D7 A+ [8 e) F+ V
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。, d6 @' O( O: F8 L4 O
- V4 D1 i9 u# W- W
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
: h5 K. Z3 z8 `; `5 \! g
3 N& Q* ^/ b4 ^' K& @数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
/ y4 n/ {: i& x& ]3 g Q# O( m/ [8 \6 q" Y: T3 h
<?xml version="1.0" encoding="UTF-8"?>2 X2 X' ^, Q+ a3 w8 I& w* i) W
$ X/ s3 x! N x" @$ l% y4 R
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
0 q. ^$ w5 I" s: z* b) r0 [* S" t3 u7 f5 c
<orders>8 y* W; X" _$ J" S9 O& G
- ?$ j1 J' [: d <order>: Z0 y! T S, ?, L
- P6 `6 H8 j, X: `& Y5 A <customerid limit="1000">12341</customerid>
. p; I! D% ~' X6 i, ]' q6 o7 H% d( G8 {! z
<status>pending</status>, n. o0 x" H, q- F5 K
8 h2 c9 X( S- Z8 G' _ <item instock="Y" itemid="SA15">
2 r; [# ?0 a% k1 N* P
* f& h6 P3 ]! I q <name>Silver Show Saddle, 16 inch</name>
% D' {7 ^3 C: y# Q
# o- m4 l4 }: y/ I <price>825.00</price>
$ O. \3 I9 d. S' U' T% B' T3 i# `8 t3 [
<qty>1</qty> c' ^, e) A6 f4 m$ u( o9 _4 e
. ~: H$ f. ^! i, ^1 v# r
</item>
0 D0 Z: Z% o+ @4 V# @ N8 V) I" E" o F+ D) c9 I
<item instock="N" itemid="C49">
3 \0 @% I" S3 \0 ?9 }. V% n4 d/ d3 a9 v8 o$ Z
<name>;Premium Cinch</name>. s, U; x9 ^ @/ `+ c
, o1 F3 L, p* i <price>49.00</price>
8 b6 V4 D! x2 A* E b
5 b- L# [ g/ c6 C <qty>1</qty>: x# t( \" Q% u1 K0 J
! b. y! V5 G/ w: c! h2 G4 H* a8 C
</item>/ @& e( D; C0 E# c) d
- g+ Z. G6 Q- n$ p2 @& Z
</order>
; h1 p+ r) B( c" {' @) y
0 m. l" u+ n, O/ ?3 _5 [/ I( w<order>( O5 ^' b( g/ a( m0 K! B' C4 E
3 F, |, J( i, J7 _6 `
<customerid limit="150">251222</customerid>
. e5 S$ n( ?/ R7 A2 \
/ c# \0 w$ K5 |7 S! F <status>pending</status>
* }& h" B0 \- K8 ~' T$ U# X2 C# U
<item instock="Y" itemid="WB78">
, S9 q- W1 G" d( L; u9 B, b z" K& v* w
<name>Winter Blanket (78 inch)</name>
2 {9 a+ d3 F W: [2 Y
E% \1 |+ s) v! K, j2 c0 } <price>20</price>
+ r M- v% {. _3 [/ K2 s. J# K, {8 v, y
<qty>10</qty>7 v9 j7 {8 \; G$ G5 u' |
' p O) T# a; R </item>
' T6 ?: u2 w+ y ?0 j0 }7 L0 M, N# b9 Y2 r) i, Z. }1 B- B0 W6 X
</order>/ Y/ u* d& C9 W* w' Z
' Q8 R% m6 o: g5 G, V% b3 x
</orders>
5 o1 V3 ?) {6 {在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|