|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
* _% U0 u8 J" e/ B4 ]. A8 s
开放分类: 互连网、网页制作、web技术; }8 s6 L: q8 y$ w" \* |+ B( _' M# ~
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
) d: m# y7 @: e$ [& y5 T! [
0 `# W5 f% ?" ]6 Q# o* o0 _: V9 J7 JDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
3 C7 L% @5 H! H/ H1 M( b/ S- [- c: ]) I' M6 E/ S6 @
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
0 R0 a! X5 k5 |8 C# m7 N3 ySAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
$ `/ N; q% P; T* n+ G4 e( u
8 p! s7 b F( Z- X另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段# X% i7 B& n' x) |9 p
2 D) J9 Z' q) I. }: ^( a* c解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
) K1 B0 s0 Q& x) W0 B; ?, c% b! C) i5 W5 I/ K3 j
作为 API 的 DOM% r3 ]- q X+ }2 L( h
6 [" b# \4 H. y* C# R3 @
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。' [7 h( w* d# j* X
& r, j7 M1 n; r E& N4 L* CLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
/ z2 s- p$ V6 _/ S6 [
* u8 `& ^" a! ~0 kDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
) V0 x( C. _4 ?3 ]2 H
5 } Q8 I8 Q; s+ \1 M( J0 u) e当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。3 h0 M$ w+ E- Q8 T8 _
1 w, X# c- W+ @5 k* sDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。8 M* {% ~6 R7 }0 G8 O' N3 ^
1 N2 H3 Q* W' R/ e1 q; U9 J2 K2 A
确定特性可用性' A9 f3 b& s, X9 ~* i$ x( Y1 |
4 w& V! A9 Z* U& VDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
$ `0 ~- `' |0 _. I$ T' Q
; I$ w! `8 _* f3 P+ E: o/ b) X6 K4 ~DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。4 r1 I9 F4 T6 K2 i* D/ G! b7 O
4 g0 [2 T! Y: I% ^; G' Pimport javax.xml.parsers.DocumentBuilderFactory;
h: @, s' ]" P/ [4 U$ X$ {$ q/ p1 r' u" `2 x' W
import javax.xml.parsers.DocumentBuilder;
+ ^, v! K# ~# u) T$ ]. [2 O' b: z2 B0 ]9 `" P: Y1 r
import org.w3c.dom.DOMImplementation;3 j' I' J6 e% ]* \" R3 a) t7 O- j- c* H
5 ?/ T9 ~- B' i/ z4 D2 g! }4 T
public class ShowDomImpl { K# B4 _6 y8 a" k
" I6 t0 |# s$ j* A, I2 t
public static void main (String args[]) {
5 |. ]3 N2 t- n* G ?0 O& B
$ }# u# }: O5 p. Ttry {$ a% k# N$ I4 n8 m% a
: H; S' m* m8 f, Z! |DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();0 d8 B! b g+ u& f9 ?
9 j+ w/ z2 |! t D$ S+ q2 o, CDocumentBuilder docb = dbf.newDocumentBuilder();
' c: I5 w6 |/ V+ F2 K7 e
( S1 H9 {2 t# D2 yDOMImplementation domImpl = docb.getDOMImplementation();, ~( b3 W1 o$ Y* j1 X. S
# j) d' N( x- l# R
if (domImpl.hasFeature("StyleSheets", "2.0")) {1 ^: f3 Z, g0 A) u: W8 B1 ^/ d
2 V0 x7 M! z% @System.out.println("Style Sheets are supported.");
! Y! @5 V8 x, _4 h4 B( o& m
" f; G$ ^2 n; \} else {
1 d& l8 e4 W) u/ R2 L' k, f6 j4 q% I9 Z4 F" U
System.out.println("Style Sheets are not supported.");' G( o H# L+ h- U
1 M. Z! u( d2 r3 I$ X5 C
}
! f: F3 _! ^6 s, x, J, A( P; q0 h2 s& b- n0 S; Y* n: n
} catch (Exception e) {}
4 I, y# j( ^$ @/ m
% F9 n/ C& Y8 k+ w2 f( b, _0 V}0 v: D$ `( r* J# B# [8 U
7 Y& Z+ {- [$ F0 t! I% f4 ^}% v- T& A8 [* r
4 ?( H l A9 x1 p6 S2 [
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。) f) c0 v4 a: }4 G5 A8 O" R* r4 x" l
6 x* R: n) R$ X' G$ O本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。( U9 _: p2 C/ T' m! c8 c' y
9 M+ V7 Y- M/ c) e& b
基本的 XML 文件 m, L1 l5 l) j2 U
- s$ l, W/ f' B& i& p: ~3 z本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:. P. b) Z. O. A! j- E
4 D6 ^6 j' K* H6 l; e/ d" j
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。* R2 A" q2 z3 ?" B; R( g" K" o. {
# v1 w- d* R# N, j0 O tDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。1 I/ f( Q* j( G1 M/ N
+ m* G# Z, U5 f6 |& k数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。9 h/ H5 `8 B0 X# M- l' }/ K) _
P2 {3 a0 v1 o4 o' z0 o0 D<?xml version="1.0" encoding="UTF-8"?>
. i! u1 C5 T, M/ n
* \1 L& k/ l, Q; G0 {- @<!DOCTYPE ORDERS SYSTEM "orders.dtd">
/ t5 I% m. v) V9 Z' |
0 j m2 h6 x: A6 w# F<orders>
; E' T8 S3 \, k% U5 R7 |/ j1 V) R( k5 e; w2 I; o K }
<order>
9 r: F; W! o2 G T o% F/ G' Y4 u
<customerid limit="1000">12341</customerid>% L' P, g8 i3 g& C6 M
* d( u N0 r7 r6 J
<status>pending</status>( \7 K6 q% h0 q
; J( m: l" i+ m! _
<item instock="Y" itemid="SA15">8 T) t& @; W! M. W0 b
5 T- H8 f1 G3 M5 J# q' e- s5 i- M# L <name>Silver Show Saddle, 16 inch</name>2 c: H* W3 x4 }' l) ^ m
0 d7 x' w1 a' h9 ~ <price>825.00</price>. ?& S% y( v7 l7 a3 u
% q# m& C4 m4 W+ \* C' k
<qty>1</qty>
0 v) {2 N V$ f8 r( w1 j T8 ?3 E& L6 w
</item>. j, O! Y/ v7 r( g3 M7 m" v
7 j7 ^% z& ~1 N; V ` <item instock="N" itemid="C49">; d" N9 M: Q0 u1 G3 `
4 n6 a7 N+ V$ [$ n7 g, o8 g/ V
<name>;Premium Cinch</name>) Y M7 _$ e0 ^( f" K) s
' b* q6 O. @- p6 w) Y <price>49.00</price>) J' F3 J8 J6 k4 E
% p' b% `+ Y( p <qty>1</qty>
/ J$ w3 l1 c# c5 P6 j# h4 K) i2 m3 D1 U E
</item>/ a( J, C4 O0 d% B7 ^( c9 T* `
; }& T/ ? H6 M! I- E </order>
+ z$ I0 z4 A+ C& w0 ~" g
% x: V3 D0 Z5 h: t<order>
. H0 v. L& U) J% M r8 U. V1 ]2 e9 M/ E
<customerid limit="150">251222</customerid>
" q$ q! ?0 j" T3 \0 D; d: `+ _1 s' M" ], ^% K* F
<status>pending</status>) s% O) j4 k) }0 z6 S# h! ]
/ `' ?+ H6 {" f9 J& U; K
<item instock="Y" itemid="WB78">
$ j1 N# w9 K+ n
( d# m$ i( Q) U/ L# j <name>Winter Blanket (78 inch)</name>( K1 D; p2 Q& l! p/ G3 d
3 M9 M1 q1 j7 f2 _' O* n, }# R" _ <price>20</price>( M% e& _' C2 h: `* ?
) s8 H- p/ Q+ }, [( E) v <qty>10</qty>
' g/ W% q4 ~& W( S0 _. d" k
% e) r$ C8 y% l4 _- A9 D2 L4 L </item>
% o. N! {( n8 @; b/ [ f* W3 P& ~1 t7 Q! ?
</order>
) T1 d8 ^8 S" S! T8 |- N0 V1 X' H% W$ f* ^- u9 W. B: x
</orders>
% j+ r" i' R: k4 r: U在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|