  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
4 i; v, t. h E+ g/ t- D) v V; C6 d
开放分类: 互连网、网页制作、web技术
2 d+ }! x+ H& r# w; }- C& J& QDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
4 I: C! z* P& c* Q7 v, q
8 c( O0 Z3 ]$ W" G. J% rDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
2 d8 ]# e+ D7 s: }- ]1 N
+ N. s- ^, j$ J; A7 m8 H6 @) I+ d对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
]7 z! q& N1 |4 }. O; V, e* M3 PSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
! i4 g- V2 z/ i1 N. Z; R% @( ]
+ h0 o% Z1 I+ ^: d/ z5 n! y另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
8 `3 K- H9 I1 o, t" o& H$ i: L
0 g; N$ u" f) g: @解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
4 T- c8 C1 r9 z; X/ z& {* w# \$ O+ M5 @& S; ~# ~
作为 API 的 DOM
/ [& j3 @$ P! \/ ?( A1 c3 E; p2 {+ P2 k1 T
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。8 M5 E6 y9 H7 e8 `
9 G6 H$ W- a, d0 Q1 y" KLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
( i+ A4 r2 ?. U3 [* x
: h4 U/ T2 ?9 W: |5 KDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
+ l n5 X ^' c; _1 C
1 f6 ~, j2 q& x, n- Y当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
. e! O% W$ s; _5 e+ x1 c: K1 u O# R y- Q9 E/ E
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。& S5 a4 w3 w& n W6 m) v/ `& _
3 {* Y: E& }8 @! x6 f. [/ X* d确定特性可用性
: f) W' X- [" f" k8 Q# p8 k# q, _ I' W0 O6 j& v3 X+ | |5 \
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。+ h2 P5 I u. G4 I% n
* x1 ~% y8 h$ `6 p' j9 Y5 S2 V
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
4 f+ c0 c, {; Y$ @! I2 h/ ~' f2 V [' |) n! L
import javax.xml.parsers.DocumentBuilderFactory;
( t3 z. K5 O2 _8 B% Y( ^3 e/ a4 y! `& |7 ] T+ t$ P
import javax.xml.parsers.DocumentBuilder;
( C R& _* Q I1 E: P- a6 u, _7 o' } f8 `& c/ b# Y
import org.w3c.dom.DOMImplementation;! c8 C" D+ ?; N z
. ~0 ]0 Y3 ]$ o. P' o/ ?
public class ShowDomImpl {
$ ^9 |/ ~0 I+ u8 ]3 i/ a* K& w! b5 f$ x5 |7 r
public static void main (String args[]) {
d0 c: S3 T6 V& o% W8 q6 V3 @9 A7 _0 o; I& M, Z, ?- K0 D. l
try {
. ? Q) c8 Y8 J5 f3 |' C* o3 F, k
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();. D9 r$ m1 {9 N" U# a
! b' T9 A% q7 S4 R3 f7 B) r- q0 v
DocumentBuilder docb = dbf.newDocumentBuilder(); q" X% P/ U$ S" {- s
1 G9 d: N* Z0 O- ]& PDOMImplementation domImpl = docb.getDOMImplementation();- j" h6 E) G' O
. h( B/ D4 \1 q2 d% L! L3 ~
if (domImpl.hasFeature("StyleSheets", "2.0")) {' z- [" l! k |5 u* P+ B
, w/ m$ U+ r, m# z
System.out.println("Style Sheets are supported.");' Y$ A' V8 S7 I5 g0 M J
2 W2 |! `7 a' T* w& H
} else {
1 T# Q* M X% X! z3 _/ a4 K7 C+ ^. ?+ h
System.out.println("Style Sheets are not supported.");
1 a2 k: b* |; o1 A% ?- Q$ ]8 X8 u/ G9 e* D# n1 c/ ?
}0 t, T- ^' N8 l7 ~
7 D' W; y0 W( N. ?* g0 ~( }
} catch (Exception e) {}9 T8 B4 @7 P$ W. L4 G% ?8 g1 E
- P9 H9 d( c* Q2 b: y}
/ m# `4 @6 L$ o/ r8 D4 i- C4 j3 f2 z$ a% S, {
}2 B' R; H0 p" w8 n
& Y4 G' ~: q9 N3 R7 r; [, B0 `/ k(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
, V& p7 E0 i7 R W& ^! \; |. i! n, O& b4 A3 z
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。, G Z2 ^' `0 ^4 o- L0 D
$ k( ?1 @% ]! m0 e. r
基本的 XML 文件
1 C4 o0 ?8 R: u/ n( s! Q4 e/ s8 \( s& @/ X( @9 ~, D
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:& e( b; ]' J% ^& I, ^
% U8 n" U; h" k* o# x7 _
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。% O6 p! b- v, a) a& S8 r% O
0 r+ q* w6 u% C& u4 t! k. B
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。9 \% Z8 B+ X6 M% b
. p: }' S+ H# i7 Y8 {" C8 S数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
3 I$ n8 b( ?3 c, ` s! C9 J8 t$ k( h( I, u
<?xml version="1.0" encoding="UTF-8"?>( l& r$ z8 o, m" `
( ?# y$ `. W" w3 m4 y
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
8 v2 y: G0 j( n+ T+ A/ p3 @7 ~3 `3 n; n; N+ b& P
<orders>1 p) |& {: y1 B' ]' J% M! @
5 ^8 B6 L. Z9 B) B5 J' i4 p& ^
<order>
: o* R& y* Z g d; a% [! n
# L- v4 J2 D" ~; [) I8 D4 k <customerid limit="1000">12341</customerid>& p3 `6 _) D9 s: z! A
3 d$ `* {) ]6 U1 t# P; f
<status>pending</status>
( S& h7 ^! _, U( I# t T- c$ ]. g- n. Y
: h1 }5 n9 f* l& d9 @8 R& H, s <item instock="Y" itemid="SA15">, C& j V2 o7 ]% M# I- D" f' L
; X# ]3 N4 X4 D2 b
<name>Silver Show Saddle, 16 inch</name>
% r) W4 K9 p0 a$ {
3 g6 f; R2 L0 \ } <price>825.00</price>+ {6 M+ E$ W& \5 ]5 O; W0 K9 p
4 ^2 o+ ?! O* s9 M
<qty>1</qty>0 ?5 T& V& Y! S3 j1 |; [
1 Q' }1 [1 E) A </item>5 n' _. D+ a! b {$ {% Q7 B
( E* V/ `2 ~5 x; \& \; {& k <item instock="N" itemid="C49">
& Q% o. |9 W" ]4 H$ D5 n) V+ y
<name>;Premium Cinch</name>* v3 O3 Y" ~ l
3 ^: L* c( Q. |0 k6 M6 S# V1 ^3 B <price>49.00</price>
q$ n9 z4 n0 k1 b8 e4 F
5 o+ a' a) p2 u. z0 L <qty>1</qty>
2 O( d: c, o8 b* Y* k* _ J3 A! z; \. }8 W4 [: E! C9 H2 H
</item>* l" J5 ^- W# |1 }+ c
8 I6 d7 j4 \: Y* B! \9 i9 {+ s7 c
</order>
; _/ i$ o* P0 d- [0 V, T' ~9 B0 a2 `9 Q3 P* q
<order>( `) Q2 V$ j% T
9 o! Q v- C2 ]7 o; ^* f" [5 D6 B# F <customerid limit="150">251222</customerid># @) y$ W! s9 a
/ i' n' j- F" V
<status>pending</status>. K6 P/ K _6 }( v' a1 @4 w1 u
( y6 b$ O3 Z$ n+ r <item instock="Y" itemid="WB78">, b5 H8 N1 x8 e
1 i+ Y1 f# P+ b! U: E, t
<name>Winter Blanket (78 inch)</name>
" _" J; G% X, K9 h! ~. h& i4 k) m4 a" E3 Y8 s: @
<price>20</price>
5 U* Y( z% G- f: e9 Q" }& R
& z6 r+ \4 n$ o <qty>10</qty>! N; \+ x* d+ ~$ [& @$ v
+ H9 n8 g, O9 b* O9 R </item>+ C) @3 N# C" E4 b
) Q) }* X+ F) K8 T3 H* x
</order>% ?) J- t. \2 L: J* s$ l @
( c; s9 I& i8 @- J) T( s5 g* X
</orders>
) {. q2 l- |( V. E: d7 T在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|