  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
' X7 W6 x4 j7 Z& y7 Z. ~. Y3 s2 p
开放分类: 互连网、网页制作、web技术
: \$ |' M1 B( c: h( \; J, h: dDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。7 ]1 Q$ I& y0 |# F% M8 [& V
" G" w( f7 t- Z0 SDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。& ~) i+ \- ^5 q. A6 T9 V6 e, r9 C6 B
2 }; @6 \! ?* ~% ~- z9 A
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。4 s4 z3 z& y5 X e9 M
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
: i# _ Y* T L( [. b
. w- J8 x1 l6 D. \9 S另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段9 }) Q5 c+ D8 z
' l4 ?# A' ]' A2 [! h; a. N
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
5 c2 G1 Y2 v+ f, z4 J C7 V/ t: r L; g4 ~5 B1 H
作为 API 的 DOM
% C' n3 H% D4 l/ D
% O1 A0 Q5 e5 r& {8 M从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。& C& ]) u/ V0 K& ?& _
, ~3 `: l+ `/ S- N; o6 X' }+ iLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
- ^+ E; Z4 m* W6 f& C6 x
, Z+ F0 N% h5 K4 DDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。3 |/ u7 m' K j7 t! ^
/ N; h$ h7 R+ h3 P当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
. s2 S: n: [4 D' f1 Z6 B; F* u
. p2 q1 ]3 ?9 O) u- q6 WDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。$ M0 p3 Q* C; a y
- ~7 \1 [2 K- d" P. n
确定特性可用性: A4 Y: w8 `/ Z2 Y
3 E" h) |5 ~ O% {% A8 r) ~
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。! |; ]" @# F2 p, D j2 F/ a) d
* E/ H% N1 ~2 y2 b1 x
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
# ~# F6 h( \ I8 [( i$ s" i. b# x! b) Q! d- ?, [6 V
import javax.xml.parsers.DocumentBuilderFactory;! w" X1 v1 f/ K% p L7 n
5 _1 f& h9 r" C0 u$ b
import javax.xml.parsers.DocumentBuilder;
+ d1 Q; t/ u; x6 ~* u1 m& E- a6 ~5 p" f' E
import org.w3c.dom.DOMImplementation;8 V6 \' O" v. K- B( ?
' @# x8 o, Q) Xpublic class ShowDomImpl {2 \% r7 @, n& ~1 q" [& }; i- |0 T
9 y" E. V- G' c6 Y
public static void main (String args[]) {' D( h3 @9 W% u& o# o1 |
- I! a# S- @' itry {
( l/ E& f$ Z3 {0 c* ?& S
5 k- W1 } k6 d& r5 _7 NDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();3 T2 K8 w0 N% R
8 F/ c; ^5 V# }. E) {* K
DocumentBuilder docb = dbf.newDocumentBuilder();4 X8 m" U- b7 h5 C- D
9 W% C+ f! S: _% I- I
DOMImplementation domImpl = docb.getDOMImplementation();
, @/ N! K: J2 N# @
) z) H5 t/ ~7 t& {9 o8 \' Mif (domImpl.hasFeature("StyleSheets", "2.0")) {4 U5 b t b; _5 S
5 I3 t* W' Q4 i2 K) \3 @/ m" \System.out.println("Style Sheets are supported.");: n* c3 ~9 b: ?9 A* E) H
7 n1 V& {9 E0 X& o* ~} else {/ K3 g) U. H* O( `) x, s1 V
# O" d4 X) U+ Z# Y
System.out.println("Style Sheets are not supported.");" Z' d: e1 C: N: l% S" M
4 o5 ~/ E/ ~. t0 W}9 e1 |6 z8 e( Q6 P/ g/ h6 \
5 O# R9 v7 h! x. Y/ t
} catch (Exception e) {}$ [8 V3 w9 G$ q m5 k4 ?+ S
6 f$ {" p( a9 u$ Q
}
5 ~) j" w" n" I* q2 R% P% r- o: s: w* H+ X
}2 x" f: m) q2 j' h& t1 V
8 v1 `( X; D% n, }, a1 C2 D" z2 `
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
% m9 Z B) o( O8 ]0 O6 }5 j6 J9 m) n( l- K; Y
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
& Z$ p9 X4 S7 o( E6 j! m7 z! ?* F5 |# b& ]+ m `8 h
基本的 XML 文件
2 A6 Q+ P5 Z4 \6 V' H* q0 j( R
$ P+ Q Q: k8 k7 u+ w3 D本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
: m. p8 g$ [5 m, R" h8 H7 Q. R6 l1 P9 v' U5 \+ g x- u
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
# d2 P- ?* c9 R$ h- T9 u$ @
; i0 b" x& j, y& h, s* g- VDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。' e3 n8 _4 @) C" W% l% f
' p4 R1 A5 |. T9 i9 i9 \
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
7 D1 Y) y& t0 p8 O4 P3 }4 D. {! C: c( P8 q
<?xml version="1.0" encoding="UTF-8"?>* g6 W. E* V1 G; b8 u
7 r+ M! B$ A1 V* P) r& S' L<!DOCTYPE ORDERS SYSTEM "orders.dtd">
2 ^0 P; u$ V3 \* R3 F; Q+ H
% K2 d% s. n0 H8 f# H<orders>/ e; n4 f5 ^2 I+ |+ H- ~" c4 c$ Z
' S: A+ d7 P/ e% L3 ` q- c7 e <order>
+ V" {) ?6 I+ v
9 m' |, D; f- H( g0 Q <customerid limit="1000">12341</customerid>
& p+ d! T% W1 o5 i% K% V! f3 @ M( \0 r0 V
<status>pending</status>( [4 r0 W7 p/ Q& ~; d+ C0 I8 z
% Z" H1 n5 i5 ~$ ^" i! K <item instock="Y" itemid="SA15">
/ `- C' X6 p$ J/ s3 l9 B- M2 a8 l1 F8 x7 [) X
<name>Silver Show Saddle, 16 inch</name>$ H L7 X! F: p8 l
+ B* l$ x6 Z, }. |( U/ U0 P$ @ <price>825.00</price>) n$ x d& I; X7 M( s
9 |) J: r: h4 h% q1 Y
<qty>1</qty>- E8 c# E9 j4 Q1 Q) B
/ R+ R6 x# T, ^6 c
</item>
. c- @( k2 f0 W- ^" ]' R4 t ^1 {) H$ N4 U% c& |
<item instock="N" itemid="C49">/ R8 N( r) w$ Z0 [; q
* @- [( |' l# L# r, a" u3 C
<name>;Premium Cinch</name>
: M" X. z- J. j- q- `" J! a7 p" f
1 N; k9 d; o/ l$ m& l& ` Q <price>49.00</price>
7 D, H! t0 |: r7 X4 A; a! B# [# E, ]+ h2 b& x5 I) N$ W- Y
<qty>1</qty>
g4 N9 [+ e2 r4 F- c* h" b/ t) g9 Y
</item>% i# }7 u# ^0 v% M8 [4 `
# g: ^; c8 g) k0 B K3 V </order>3 D1 `$ f* @1 Q) O
# h' n9 S9 Z# I+ W0 r: J<order>
7 E- o# G% a: d- `3 r0 ~3 B, |
! i9 @0 u0 R) C" n <customerid limit="150">251222</customerid>6 k1 J5 T* s$ P& G; W4 L$ u+ F
1 F& f' { Q4 H <status>pending</status>
1 x. @; E9 u L. z- b% J0 t" {1 \' i# {: D
<item instock="Y" itemid="WB78">
9 F' k6 T! M- _4 v6 C
8 T; t) V2 ^5 j& b <name>Winter Blanket (78 inch)</name>
. y4 N' b7 F) a3 A' p, h4 T3 m) S6 g" i
<price>20</price>
! C3 T1 w# B- y$ {$ f U7 w4 T/ r; J! u
<qty>10</qty>. t5 h% C* m0 O* v0 @: c( Y! G
5 [0 y8 p8 B/ i" y) c1 e9 A9 m
</item>' E- a( \1 `* w5 u7 ], y2 q0 B
, C y! e6 m8 x' d3 P! Y
</order>" d) X3 D: l: D9 T( p; s- X- r
' r+ L: j& i$ f: [</orders>
" u4 @. A6 }/ B在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|