|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
6 j, P3 Z2 p4 `" C6 E* W* t开放分类: 互连网、网页制作、web技术
! g9 _7 C' ^8 f5 j) R( vDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。- B2 I; V+ ~ H5 e5 `" X
6 ~- q, G) \2 R
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。6 Q+ v2 M7 q3 y7 ?! b$ a
/ T( \1 ~' }2 h9 C1 G7 F* |对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
: l8 a% o% J1 ^. H3 R/ n- d& ?SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。+ A. `: `* V$ M: l, d
, Q1 ~+ ^$ X: i: p$ O另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段( B9 u& h* [4 `6 Z+ R: Q
, h8 s2 g7 z t1 O# b解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。/ e9 {+ d/ n8 @
! U( p: i# B) ^: q j
作为 API 的 DOM
2 n, r7 k6 y$ @& m! r- \
7 p! r3 `$ M; n6 u从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
, X3 R) k* A2 _$ I0 _; e. C8 g/ }9 [
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。% e. S1 ~3 Y. A. ]1 a/ B
" D. a; D7 ^* c2 W+ tDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。0 w \7 T7 a/ h. R1 h3 ?4 t& K
2 g8 i+ g, t5 b" ~3 z4 U! R当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。3 A( ]* }' o' H- z' @4 ]& n
) S \+ n5 V, \5 X0 Q7 g
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
* E1 Z) b3 r1 c: {
. s) B1 ]$ X& I5 ?' t% h/ A, a确定特性可用性
9 i9 ] K: @, ]) Y& K7 \
1 Y) q% ` r7 t! ` KDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。. C, f( W4 w9 n
) s- j- T7 B' GDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
& F# B' J1 K. z* \9 Q
3 F# Y0 h& ^& m5 b7 B! Mimport javax.xml.parsers.DocumentBuilderFactory;
, l* ~6 _4 U& n5 |
) O9 n6 @6 f( w9 Vimport javax.xml.parsers.DocumentBuilder;- j8 h x* U$ i- a k0 ?
2 q- x' P: s; H$ }import org.w3c.dom.DOMImplementation;
. D9 h" L# ]; A2 z
# C5 d9 U2 F7 w9 T- Y6 apublic class ShowDomImpl {
N9 P( H- }: m: J% j" p6 a" {% J# M. h5 ]
public static void main (String args[]) {5 ~# ?5 V0 x+ f) z3 R- |7 V% a
1 m( Z: h# @- Z; }9 R9 Z% `! y
try {
9 ~. E5 r# h7 C) @! Y) p/ Q$ u' ~* Y& c
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();! G& @/ j( B/ J
& g1 s7 V# Z2 ]7 s3 w C
DocumentBuilder docb = dbf.newDocumentBuilder();+ l, A. `0 M F. f
" u( n0 i" |" m" ^9 B1 t f
DOMImplementation domImpl = docb.getDOMImplementation();" E* ~& m$ c: O8 i8 z$ t9 i0 a- p
/ A4 w6 K9 \( o. _- c( E( Nif (domImpl.hasFeature("StyleSheets", "2.0")) {
, c3 X0 `$ D$ \8 V; B# i
2 L; K) Z/ p! F( i) `System.out.println("Style Sheets are supported.");2 ]2 F9 p9 `/ h8 N$ r& O( w. {! O
( b Q- M# ?! J/ D9 [- I$ |" g
} else {5 U2 a( Y, _' s
2 h( l9 n7 y* ]$ o4 p% }System.out.println("Style Sheets are not supported.");0 C" S$ q6 P* {7 J
9 f7 ^: u% Y" I& ]
}, l! ^4 y8 F6 |7 y$ I( s, X
# _2 Z0 j3 K! c5 C} catch (Exception e) {}
5 g9 R2 e& t4 x7 y* q. c9 D% L# [: G& [1 y [4 L) W5 D; I4 H! t; ~
}3 v, |+ H* i# f/ C2 p% b) S
- g7 T7 Q5 y& G
}1 B8 P# i; y. V7 V/ N
. t( m! C5 o# g. m$ V, t(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
, R# K C' x* J+ `& {, B7 V0 a9 Q, ?
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
4 A. M. k% A1 ~8 W9 n0 F9 X" S/ l, M" t( G. K0 R- l+ f3 ]/ O% U
基本的 XML 文件" N/ r" S+ Z* k( S% e; G" [
. v- c1 I% I# b/ ~
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
: Y: D# x4 g( Q- W/ ]( ?6 ?$ @, X9 \+ }
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
3 [/ ]+ o/ E8 U' y' E7 h1 j1 [3 R# X3 t- L L
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
1 _5 c; V% x" q% y5 m) F: ~9 ] J) Q# W5 {) x% T( D; C6 Z) b
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。( @2 l. E5 Q/ w( E
/ R0 r* g: @9 I! M. \<?xml version="1.0" encoding="UTF-8"?>
5 O, ]5 a" V c" p
6 k: b. }7 N7 x; Z6 u<!DOCTYPE ORDERS SYSTEM "orders.dtd">0 G- o3 C' _1 y
! z4 v* |/ X: a; H ^$ w
<orders>5 S* A+ h4 ?% G
) K% R" k# \9 ~! W
<order>0 M* ^# A1 p; f- B1 L" k' T" l( j! x+ U) D
' N) G1 q! U) ` <customerid limit="1000">12341</customerid>
0 S' ?: r+ \# C# E% Z( _4 r' [& s# a S( ~. ?* G
<status>pending</status>
$ h5 J. h8 } j3 v8 `% g3 R( T$ M
" F+ `8 K3 M% K6 C+ x* h$ s <item instock="Y" itemid="SA15">
# H' S* M& N% x' Y
i# B9 z) A- }2 u8 @2 S <name>Silver Show Saddle, 16 inch</name> _: h, F; ~: j/ Q% L+ }
% k( h+ [) t( g1 | <price>825.00</price>
/ |3 N3 H) r+ w' \5 R8 O2 |% a1 g' U+ q' u1 @
<qty>1</qty>
# ]5 H1 h6 d. C! l3 g ]! Y4 H
. I) q6 g& R+ P; f& w$ _7 c </item>: B! g3 W! B' `
/ Q, A: [3 ^/ K+ h <item instock="N" itemid="C49">
, H- H, A1 o0 ?1 z' X# `
% f' t4 V5 \& A, V/ ` <name>;Premium Cinch</name>
$ v( w- y) _" h
6 ?" P; c) L. a6 h6 w) f3 a <price>49.00</price>
) [" l2 A. {6 ~& z% @, [1 p3 A j+ X2 [* V0 z( I, }4 O: p
<qty>1</qty>) i y y7 A$ y; `3 N m( m) o
8 l3 C8 I1 ]6 X2 u( z </item>0 F) O* H5 Z6 g0 s, j7 h. Z9 |
$ H8 {' g) K% p" B </order>7 c9 X4 G7 X& Q& k0 \1 P
3 U1 H2 H7 l. V- p( f* ~+ m8 u4 E
<order>
' k1 m* E; d; [* `" S& B) B$ u* @
<customerid limit="150">251222</customerid>
) x8 M l7 S, t# ~6 Y# X6 k3 g. }& X2 q k6 _& T8 ?! M4 l* C6 \
<status>pending</status>
7 s; u! x5 V' z$ ?8 `4 Z" ^9 A1 Z* d6 P
<item instock="Y" itemid="WB78">
4 L# }+ N& { f3 Y% V* t9 ]# J/ G' g4 p+ ^6 D" U
<name>Winter Blanket (78 inch)</name>. F2 X( @- |# m9 g
" ^" V: }% K% m, g( u% R/ y
<price>20</price>2 o& B3 |4 ^3 H5 m5 n0 G
# n2 d }4 p+ L" G" U4 l9 n
<qty>10</qty>
+ {8 u& t# ]8 A0 b3 M' ~; w. s, D$ o& O& K; x7 I+ d
</item>+ O3 c3 x* | @
% o& x/ W' w8 f</order>
3 ?: {0 r. ^. u* n+ v7 \% \8 ^. J: a- e& P+ w) p( z0 F, f) d
</orders>
, Q- E/ q0 ?+ X- T5 c; V# ^在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|