  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14219
- 金币
- 2400
- 威望
- 1647
- 贡献
- 1348
|
% j, n7 O) y$ b
开放分类: 互连网、网页制作、web技术+ M8 v) S C0 I, R' y
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。: L6 N* f: Z* s
$ e, |: W4 E8 h2 W/ FDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。9 b1 y) w; e" Y# Z& [
1 Y* r L; X% W对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
% |$ k: v6 T6 ?. |SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
# D" b; E7 l: }1 V
( R8 w' A, e5 u6 j+ g另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
: F/ J& `& O5 h2 d
! q l+ T. y0 S1 T6 }解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
% ?- v7 a: R7 s1 t$ M/ ]2 m( k/ M
2 H/ h0 g9 r& j2 v, Q( y# \5 }. A作为 API 的 DOM
$ e" C" Q$ l" W
" b4 x7 p! Y6 R2 H从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
. n. \4 ~7 S/ Z2 u/ Z
, ] h* d, F! z& F4 e \Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。2 \2 \% z4 g9 q* g4 i
2 t% ^+ a3 z2 z, l1 X
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。' V; x) X" k; m+ ^
9 B% e J r* y! L4 A! `6 n5 J) U
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
% X: R) S B9 m; b0 z% G3 O1 \7 B! |9 b% {
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
5 X" ^: n6 [( b, ~3 D( B5 k( Q' S% n, ]6 D/ U* w' K8 u
确定特性可用性
+ ^8 G* o. ]2 `+ l8 ]$ K
. D: s5 ^5 o/ {, @+ IDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
4 c- h/ f; P! Y# S, M* F+ `: u) _. K- c9 @! m5 I V
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。+ {1 z+ [: k4 _/ h$ e" W" j. A" P
^ `" m) N1 O1 L2 t
import javax.xml.parsers.DocumentBuilderFactory;
% G, |4 {3 i7 e2 o! d2 w( @# F* e7 K! N+ C3 y1 W7 ^: t. R2 u; V
import javax.xml.parsers.DocumentBuilder;
' N1 l% N7 c5 C( h/ d8 V8 m8 M# c/ o* J0 X+ D
import org.w3c.dom.DOMImplementation;4 A1 l) |& r) R! I
$ m2 H# a% g8 w) _- `; ppublic class ShowDomImpl {
* N* c0 ~/ v6 b4 K6 L/ U% ^
E, g) C2 I' _) f" s8 epublic static void main (String args[]) {
8 H7 K7 x6 Y8 }3 I' l3 r; n
9 W- M% K8 k' B6 i, ?; Ltry {
4 g, f/ r1 X% C. {$ t. q. C
3 B* U$ F' K0 e9 Z( V& D0 DDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();! l3 D, k8 Z/ y
: Q# Q; r7 V/ p1 B7 V5 ?DocumentBuilder docb = dbf.newDocumentBuilder();/ ^# u8 W' n7 o5 b( v
0 _$ S$ h' Y0 Y/ f$ iDOMImplementation domImpl = docb.getDOMImplementation();
2 m3 {* o7 |2 O
* H q: i4 N# G( M! Tif (domImpl.hasFeature("StyleSheets", "2.0")) {9 G1 K9 L) r [" M: |
3 S+ _' H$ C% f: l4 x) s1 K
System.out.println("Style Sheets are supported.");
" N! P }- l- S$ Q5 g: T- ~3 _7 G" P) R7 c6 j: H+ K5 f+ [
} else {8 b" m: v8 p( S# I* [7 K3 b7 H
/ x9 _6 v( Y/ _9 Z) ^+ g8 A
System.out.println("Style Sheets are not supported.");$ a2 T8 T# T: p1 b1 M& n1 }+ G
G3 `" R2 N/ \ A9 G r
}
6 F' u4 [( u0 u3 r& t" q% @
" n4 m/ ]; N! i} catch (Exception e) {}: e1 s% b6 Y9 s
+ C3 F( K. @8 {' Q0 Z; k}
|3 k+ s4 b) g3 B' O! F
2 V/ B: A; | Z: D ~4 }) A/ E}
# {# c, m( Q3 U) F( q% f: h" }% g, _1 j! L( n. J
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)% T5 j) n0 h' P
% k$ l q8 Q% M6 G/ p
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
6 T3 K/ p Z; p/ `
( R. P1 R# }: v5 B% I! }基本的 XML 文件4 D r& \: E. J! H: L7 c
0 R6 u/ ^2 z4 D
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
|+ N( ?/ U6 H- Z' Z
6 j' d( @" e" H: r4 F/ S# RXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
i" D8 a( E& Z$ S1 B) f" `# O8 _2 s4 M- W; V+ Z( Q: R! P1 H
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
; w5 B% i& B& b. e. K9 f
2 [8 g- P1 q9 B2 I- |' A数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
9 i+ e3 b3 g) r8 {6 f. m
! v, L+ W/ e' ]3 Y+ b<?xml version="1.0" encoding="UTF-8"?>
; Q# C. q& ^, P, d. ]4 Z, b' T0 {% j
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
, \- U5 y8 U( f# s/ U( x1 ] c: e; v9 ?% X! y! e
<orders>
7 M% D8 D& d+ Q' R2 [. h \/ s& _
$ F6 ^! q7 ]" A3 c* V <order>
" m" t. j$ B% `# r7 J
% f3 ?, E) T2 @2 a$ p3 R4 t <customerid limit="1000">12341</customerid>' ~7 G. Q. L( [* f
/ M9 M( M: f8 l U1 h# p <status>pending</status>! m u: G' h: j* i: V) z' J
1 O' N& d& _# H4 a' B' B
<item instock="Y" itemid="SA15">
2 {7 V' v2 S6 ~* \' c M
; ^, p+ g2 S2 K9 e: J8 c <name>Silver Show Saddle, 16 inch</name>
2 ^1 C6 n; a+ z
, V9 d$ W+ e* t <price>825.00</price>
& t- R* ?; M. v
% A; A+ Y$ {4 A <qty>1</qty>
0 }- _& K! p/ m* G& x3 w
% i4 o0 l0 C' b; J2 P5 D& a" `# R </item>
7 U5 E5 O9 S1 o4 x, _& Y' k: |9 q+ e+ w
<item instock="N" itemid="C49">' A7 |( D! I A* H7 ^9 ]/ t
/ L* f: D5 f/ @. ^! O( @. K- s; G <name>;Premium Cinch</name>
: F' V! x7 x( X* `/ }9 G" N2 F' i# j2 R+ A+ x
<price>49.00</price>8 c4 N* N2 w( B- ]' o& p
( P! Y+ P1 g) j <qty>1</qty> R; @0 T$ Q7 J6 _
9 ~8 S: k& n/ U' R2 ? </item>1 C8 P: e' ~3 K* z
% r' }; V, s- P K </order>
; i+ \) [. b2 s* Y. `' z) d, e$ o: i2 R( G- e: q% G
<order>" }; _# @5 U: N* \% e
' n8 _, X* {+ D <customerid limit="150">251222</customerid>
5 [; v8 b6 D+ C& C9 E" \6 C& @, H/ }7 Z; w$ p' w
<status>pending</status>
6 f2 Z8 ]0 n6 P' u% W' Y* c* C3 B, }, e* @; d& O$ o) a
<item instock="Y" itemid="WB78">& [, i: \' K% s
4 d5 d# m& E. t& s$ q5 s- Q
<name>Winter Blanket (78 inch)</name>% n) V0 g f$ Q/ u: r( D" ]( u
! Y9 l/ {, \. D/ ?0 s- g <price>20</price>) w6 R" `3 C# r. a7 e
+ o0 y) j- `, m! l, k <qty>10</qty>/ }( V+ F4 B7 W- Y
6 g7 b9 L8 d8 c [" I; S
</item>
$ w7 \- S" b; A& T$ B' o3 v( H. C1 @7 C8 ?$ ? X/ |- q
</order>
- r' F5 X! r/ h8 l7 n3 Y0 {3 r4 v1 Y2 z; c7 ]4 h0 a
</orders>0 r+ m6 G8 T; z4 ~! ?8 X7 \
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|