|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
, r7 t% ^7 O: m. a) Y& h开放分类: 互连网、网页制作、web技术
+ S1 o3 [1 T! a- pDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。' V( ~" C% _) f6 W4 G1 d! e
' d- Z5 c! T5 ]$ Y! Q4 G0 TDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
+ s3 |4 y4 Q/ B u/ w- p- ]4 u+ ^2 J; { q( p4 P
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。, O- d$ q5 S1 h" G
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。/ l/ i* e* E2 L
9 V {/ v# Y0 \$ F$ \另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段/ X' E: U+ ?. b0 `+ X' \3 T
' q: S- o7 C; ?解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
8 P- R# p% v' U. D8 ?2 c
1 r6 s$ C3 p8 K作为 API 的 DOM
7 ~2 c d2 D. s4 E1 F- X
( O/ s7 l" ^9 x0 q( [" B& S从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。, h U5 R" u' m q' ~- }6 ~
8 P% O, F) [ ?) X7 {Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
4 p% R% q" C4 J% y5 `
; k0 `8 {' u4 [& C* X- S- v) n" lDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
' j E4 C# ~" y( u4 P) q; }, X4 a$ D" j6 O- f
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
m: _1 E9 w3 l- h+ d4 `- X2 a a" e. F0 u0 ^4 W
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
7 L0 w! ~8 k7 m
' X- p; R2 m4 t# G+ h确定特性可用性
( S8 o- b Q2 v% N+ O
% T7 f* m5 @! \% s2 o3 bDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。* V% J. ~7 R6 R9 U; C! N3 V' F
* `7 _# M# M d" l$ O3 \2 o6 vDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。/ O; n% Q% l2 C: K) U' X. u
& D" H H9 {: B, O( i0 {import javax.xml.parsers.DocumentBuilderFactory;: W) C: P; F, `) \! P/ g
' R7 }# `- N# v5 f" o4 }( g, J
import javax.xml.parsers.DocumentBuilder;
0 h/ E4 f7 L1 x$ r1 Y2 e& C
( Z1 t. C6 o% l# n5 q' C, Uimport org.w3c.dom.DOMImplementation;4 S9 h" f1 L% [
0 p$ Z4 z) i5 ?0 N: H2 H; R
public class ShowDomImpl {
! D) z4 d# P3 E" A. e$ M- i' [/ q0 f7 x
public static void main (String args[]) {* E( w w7 o$ v# k: ~; S3 x
* K5 x' r* @* m& |) }+ |
try {
( r0 ]0 o4 R) F' ~* a, H2 D8 W f# N: s0 z5 M
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();9 {( O7 [1 s" a3 I1 |
7 s7 {: w, G5 c4 p8 Z P; C- s- NDocumentBuilder docb = dbf.newDocumentBuilder();' @) {' ~4 P5 _- [# A
( d% O4 k& _' I5 m
DOMImplementation domImpl = docb.getDOMImplementation();
2 Z/ v# }6 h/ K& B. N
% b- N( l. ^6 Y7 x Fif (domImpl.hasFeature("StyleSheets", "2.0")) {
* h# J; B8 W% r
5 D J" {& Q0 H ?; e' WSystem.out.println("Style Sheets are supported.");
% A: [+ U _2 N* |& Z4 ~1 o" E8 R7 Z4 j3 o) p" c
} else {8 e+ b( Q9 [) b1 d% t6 h# ]( { j o
/ a" N- q& [& V8 X/ v& b
System.out.println("Style Sheets are not supported.");3 f$ J- x3 g6 u3 n
5 e# i0 M3 ~6 Z) E9 p8 T
}
d: m1 C# |( O V
+ |1 c% p" j a o6 d} catch (Exception e) {}7 T# j8 o4 X Y0 ]
6 J) [4 M b% X}4 I4 x! F+ N4 X$ q8 b( @; \; u8 o
/ W/ Z) s& B" c. Z
}0 {3 s4 H n( w: Y: F s ]
8 G6 E6 ?% I6 H8 Z) `(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)9 L. L( j8 r" i) x, `
7 h) n* u) K: W( v2 g本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
" n" M- e7 R5 w; `! ^
$ q7 R' Z8 T# n; ]" _% Z" \基本的 XML 文件
. p4 ~+ p& L0 p2 W. T' ^+ U1 `! y# i7 a& e! e4 h! Z. T
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
1 R1 F& G3 o# M: y* \! B2 p7 B4 l
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
# R( \: I9 }- f- N; j; O$ Z8 g1 h: W+ p p' O
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。7 e9 h" P0 [' l9 d
4 C) s- e; z" X( y数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。& F: e- i3 L# r' s
) w9 c; o; W1 C9 ?; Z
<?xml version="1.0" encoding="UTF-8"?>
4 w* O6 v/ X! X# n% X
0 I4 G2 T7 n9 b, N<!DOCTYPE ORDERS SYSTEM "orders.dtd">7 |' K0 \# J1 F0 f
1 j5 [2 \* r# }
<orders>6 ^+ C2 |/ l7 P6 J3 u
5 h- I- r0 S1 V# y
<order>- p- S) U- Y8 ?2 }6 k2 D1 E! }
& _9 T$ `7 n: G. c <customerid limit="1000">12341</customerid>0 B5 }# L7 E) @' n% A
2 _2 U7 y2 w* @- F Y# X+ }+ N; G <status>pending</status>
; o0 s, V3 }1 N
z2 \) I9 }4 {! ?4 G2 p <item instock="Y" itemid="SA15">
' ]8 B" F$ S" e/ r$ v3 ^2 m5 d' y3 W2 C, H" O5 R F( u9 ^
<name>Silver Show Saddle, 16 inch</name>
! |# \3 c+ h+ `1 Z5 l& d8 Y$ s7 J) K h& `5 d
<price>825.00</price> @: F, Z) F9 _0 o3 c: _$ d7 j% o
" |& S w& a9 W: M
<qty>1</qty>
1 ^+ ]( c1 O# C8 O
; ]/ z/ y/ q' ` </item>
; Q b l9 X' Y" {) n/ o9 Y: j& J3 C! h
<item instock="N" itemid="C49">3 o# k" l# p" k: x/ }5 y9 }; x" X
$ {3 T, M: ]# n0 D; y8 i <name>;Premium Cinch</name># d" J5 ~$ O! U7 U G
, S3 Q3 R Y" [- c! J+ L/ o' D0 z <price>49.00</price> A% z: t6 I% J# G; U
5 w; U% ~7 X# T- ]( M, I <qty>1</qty>
4 k8 l; ]& H) d! ~8 p Z+ a3 c# q! I# r# H) \2 P* a: T7 \
</item>
. H" ]0 b& ^: [: e; f* H/ v" h3 H. i3 j* g
</order>
# b) W& A% f( _8 h0 K
; \& G8 F" C, c% _- D<order>; I+ O' k) q, M1 ~- m5 T
5 h$ T+ R* R; t3 y" l5 Y! ~1 i) L
<customerid limit="150">251222</customerid>
9 j4 Z& |' N: K! P! }( p3 ~1 A
& Z) ?6 z3 v/ _- @ <status>pending</status>
; s+ y7 z5 e! g. p8 N8 F8 D- w. X x. K" J- q4 {( o
<item instock="Y" itemid="WB78">
& Z+ E. l5 O6 U1 J6 I
1 a* o' B: Q j4 V# g7 x <name>Winter Blanket (78 inch)</name>& L; f% Z6 Q' S1 m' H
6 q! S% s$ t. V6 H& N <price>20</price>9 @: u6 W/ y* {) b: ~
& E ^& e( @8 d& y" R <qty>10</qty>/ }7 m. u7 k5 f9 ^* U1 _" i ^3 U
2 U5 m4 G4 u% h+ G
</item>
% R6 i0 Q& z: Z6 v3 |9 j
, ~3 a% Y- Z0 g; E& Y" H3 W) e</order>
8 n( A3 D! l) W
# z1 O# }/ M) e9 d3 V: c0 L</orders>2 T2 o5 ~' l: a
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|