  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
" o/ ~( @5 O7 h8 e: N5 P# ~
开放分类: 互连网、网页制作、web技术
2 F2 r' W e, Q* {; cDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。 P* A8 B$ |* S. t+ h" b
% F5 J3 ^; [, E. v c" q5 Z. X
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。: l; ~% C% _. U( C! s+ A
6 u, r% y ^9 F- y
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。; `6 ~6 n( T U+ m9 x% v
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。2 z$ I L$ `' N$ H4 Y
' r' K7 ?- V9 f另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
, N$ d+ `: e) k
3 [! i$ f9 N, n/ g4 G: B% Q7 Z解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
" O$ h* d& z' t1 D* M+ C1 m! |+ m% F/ g1 M& O% ]2 A' k
作为 API 的 DOM
8 G. c+ D( e% m2 V, I( u: I8 i% E: d
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
& w4 e2 u: h* ]0 ], T, k2 ~7 h) s; Z# ?5 @+ Y% ^
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
, f* ?2 H( ~' ^8 U2 R* l
3 [" l2 v' ?; G8 gDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
: u+ U, B' o) e4 a o9 n5 \$ C$ L1 D, |
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。% X, i6 F. m( J# {( ?1 B. O7 l3 t
; I; U6 y) [. O, U
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。- o! D. ]5 m$ Z2 [
2 _/ [ H, @) ]' i! r, d; J6 W确定特性可用性
9 w: [$ p" k% x: j _1 x+ k% Y# R9 B6 V/ w4 w, [8 m/ V
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
% X# C% i1 O4 v4 q- c% K6 ?, p
9 i) y/ a4 e. _" A: \3 h' ^3 Y! wDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
6 n8 t2 F* X) i# b/ T! ~; j) |
. i# Y9 h$ H' Timport javax.xml.parsers.DocumentBuilderFactory;, Q8 S; E) T6 s/ J$ e; |* w
) \, _5 B4 `& R" k0 E$ `) iimport javax.xml.parsers.DocumentBuilder;) G+ O" M7 m6 G
7 r/ | @: G% Q9 y4 Gimport org.w3c.dom.DOMImplementation;
9 v0 ], \' c+ a5 k* Y# k- S) U. [* C2 @2 s% S
public class ShowDomImpl {
4 a* O' a6 H1 L; W2 Z! b6 d& ^" h/ m# m. B3 q( X6 D% c
public static void main (String args[]) {0 t3 {4 l+ y; ?1 L) ~. |
: }: q7 f8 u& R- H1 r% \+ [try {
' z; Q) Z2 a7 |! Q% z9 T8 Z0 _
9 |# @+ V' r2 g3 ?, ^' ]DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
. m N! C2 I, F9 _! ]' u2 }
8 u2 j; Q @9 i: LDocumentBuilder docb = dbf.newDocumentBuilder();# v9 O% Q& h1 E# q" S8 I& V
, ?; G: _* ~& u* [% mDOMImplementation domImpl = docb.getDOMImplementation();
" w( n/ i3 q: M; _. i! K9 k8 k" H, K
if (domImpl.hasFeature("StyleSheets", "2.0")) {! y6 }& O- [# Z& p
( G8 E) U& H3 X8 q7 kSystem.out.println("Style Sheets are supported.");6 t" Y% c* V, {. [& u5 N) r
3 u0 ?6 Z. t6 @} else {' k# g: D" v( l4 w
- o( A9 \% U0 E. s1 {System.out.println("Style Sheets are not supported.");
7 i* x) Z$ I# U, A
( W. N4 a9 D; h% q4 |; c" i; [ p}5 b4 r, t* l$ u, a1 I; |0 C
9 v8 W6 ]/ y0 b, A$ Q1 i} catch (Exception e) {}% S# w4 P1 p* L0 u
' S: z$ r" k- F% G}
3 Q5 M2 I O7 Y1 [/ v( I
$ @ J2 ?% ^% o9 f* _}
: w% j3 A2 o5 n6 X
/ O3 S, k# [" L(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
6 ]0 q4 ^2 |5 g
f" R: }& E( e" `本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。" N2 n) V: o4 V) J
! W6 ?3 c6 c1 b7 U8 e基本的 XML 文件
: |6 ^$ v( X2 }& f# a" p/ x! c- }
" ~- H" B1 K: ]# T7 }本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
' V/ d! v+ z$ X9 N& F8 A
# z0 J: g* E2 F( n' mXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
6 |& C) j, D( I
# w& I4 E0 C* F5 R/ E# m" z+ [DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。8 t( X9 w5 y6 K* p$ u; \$ c
5 l6 {: x& m* H! a: S: b- Q
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。. r+ J ^- o2 M) f4 V3 C8 c
1 E8 a A1 h$ T; {0 ]* Z% `
<?xml version="1.0" encoding="UTF-8"?>
6 q+ l; e$ ~* f& p
/ }& F: g( H6 v/ F<!DOCTYPE ORDERS SYSTEM "orders.dtd">9 H" u9 ?1 n: ^; v. r. k
3 E" C+ t, R/ K! O# y+ y
<orders>
4 |0 A6 L! ?/ m- A& M! D
% l; G) d* @' E <order>9 ~ |; _3 |/ t: {- `- T0 n/ w
1 k# \! W! U4 R- h: X. j. x) r
<customerid limit="1000">12341</customerid>, o5 g. s# i+ J, M' H+ B
( y7 z R. T- z- y8 l
<status>pending</status>9 p1 a2 ?6 D/ T4 C. a+ [. X
0 O* C1 b: T0 C) _) l* H
<item instock="Y" itemid="SA15">
% D: h' [% `: E! R4 Z
* x: n" n, n& Z) }* O <name>Silver Show Saddle, 16 inch</name>
/ b' H! z7 x$ m/ A* o, k6 U8 Z
% G, u v9 @6 U2 ` <price>825.00</price>7 k# j7 Y- t* n7 z4 ?9 J; h; g# I
, h4 u& x P1 I& N
<qty>1</qty>
$ Y; A |. j2 T5 K2 C, q. E
- x7 a" H% g7 \! b </item>
( b# N1 y! _! o$ c/ R) ~6 U5 @6 T6 h5 M3 v+ ] O$ `4 c
<item instock="N" itemid="C49">
5 p3 F" g4 |# M6 U) w# e' w5 Q9 \0 ~3 N4 M5 q2 `
<name>;Premium Cinch</name>4 W* N, \/ v! y# ?% J
$ K* ~9 Y. _% r; y- i7 M, N
<price>49.00</price>! j6 u2 c+ {! y. U) R9 J" }7 R
) Y0 H. ~' _7 m h <qty>1</qty>
}5 p9 K7 p1 a( c+ ?( _
& H! L% C5 Y5 ]: b( a9 t" O </item>
; P' ] {$ \% i! A' F0 Y; m
4 S" j, s) j$ L B. s$ P. | </order>2 d! a) Y6 g- A7 O1 x
" ?1 l0 z- _9 w
<order>1 P5 z. Q8 e$ V" N# `- r: ^
2 l3 @: l& g7 K& E9 z" `
<customerid limit="150">251222</customerid>/ Y9 G7 n, b- N+ b# I
9 L) e: |5 V: V% F" M' B
<status>pending</status>1 l+ `) D. B$ L( o( H6 M
' q% u+ l, O; D* F4 d* [+ L, u
<item instock="Y" itemid="WB78">9 c1 F" G, y7 v( L( k
$ J, v, j+ h+ \( v( Y <name>Winter Blanket (78 inch)</name>
0 U0 z3 w- V6 e |5 q8 M9 z' m3 k0 H& L* W3 X5 `9 Y
<price>20</price>
# A, q9 a2 h, G' j1 K
* N. b8 T: u# K, v <qty>10</qty>$ G U7 R7 `5 r* k5 |
( p/ n8 a% z0 y$ u </item>. \5 e% N) @' t- C) I
; p$ R7 D7 S& R& g( }( S+ ?4 e</order>
* O% v& ~9 @7 \* `: N9 q! ?( r7 P8 d0 |$ v$ A. ]. u6 ?) p' O P
</orders>: Z2 p/ U5 R- T) ?9 {$ \
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|