|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
; N5 \: }: {$ {( V4 Y) }% U
开放分类: 互连网、网页制作、web技术3 P' U1 ?7 D( N/ _
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
$ J p% Z! O" t
7 f" N X' m3 o _' O2 _DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。5 Q0 T# l6 z' n
4 O" Y' j' L/ a) g
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。9 y3 [5 G5 R5 H( |; G7 D9 q% F
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
, c& W+ I+ [: T: n# h, m5 i& Z- B9 H7 q: i; `5 m, U
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段1 m3 X- G5 d; l1 D) \
. T ?& D3 J5 q6 i& b
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
2 _) R% p8 u2 J8 p% w1 z! {. [# N8 ~. h- E- E
作为 API 的 DOM2 ~$ d# }2 s$ C- m
( N0 ~9 @- {8 r3 F, S
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
+ ~8 s/ L% | |; U" d6 e( M2 N- y3 z" l7 j9 k- U! G* M6 h/ i. R
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。; s+ S$ U) W% F5 v; Y* S. T
7 ~4 x+ B: P# R- X, G$ _
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
$ R' S) w2 \- @# }) q" n- P3 o, x+ B+ Q8 J( ?* m
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
/ T4 s/ i. D4 I2 {/ s2 V$ t. f( y4 F; e# U* J7 G/ o0 x: _& J: o1 }
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
E7 T5 ?* S8 K% N! ^
- g5 S' a5 m; [$ Q确定特性可用性
( A, x3 j. t' z" j2 D
. v7 L( F4 f# R J/ U. [$ _' o1 yDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。: u! p" U$ }- l+ \1 \
. }5 x# d3 O8 q$ k+ cDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
; b- y$ _+ e$ }+ U! d
h3 G( V2 n+ u; Z. G" Dimport javax.xml.parsers.DocumentBuilderFactory;4 K" N7 q/ a H7 Q
: K. C$ Z, w5 U4 c
import javax.xml.parsers.DocumentBuilder;
. x6 L( N7 n, b8 u* o
7 E* m6 `! x, \% C4 Qimport org.w3c.dom.DOMImplementation;* g( H3 F& B: U7 F& l
7 w W' v9 e( s
public class ShowDomImpl {: |/ ^6 N( _( i. `# H j
Y8 @! K2 a: x! L
public static void main (String args[]) {
7 Z9 d7 K. E# Q- g! S7 r5 B3 l) [$ [+ l3 @) K9 a
try {" A `7 q o a) N
% l3 s- q i$ e, ~7 y2 e
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();4 H `, l) h. T( S. a! ~
F* M) p+ ^9 ] Q3 h2 D! Z/ l
DocumentBuilder docb = dbf.newDocumentBuilder();+ Y* k) w$ g2 W& {! {
* a* w' c; G: p+ s
DOMImplementation domImpl = docb.getDOMImplementation();; P( y7 K0 [) h z
2 U, t( Z( |8 H4 a8 I
if (domImpl.hasFeature("StyleSheets", "2.0")) {
9 T0 U: o5 ?" i; k2 O$ E! v6 t9 F2 f0 Q
System.out.println("Style Sheets are supported.");6 J4 W: B! {; e# D" P) d
4 ~/ \+ K) ?/ B, T} else {2 [' ]; a$ d, q' W2 s
* J0 w8 z6 G/ ?9 D( F7 ?( a
System.out.println("Style Sheets are not supported.");
2 @( a8 R0 F+ R8 ^2 p s/ [, B5 B" j5 O* V- m
}
" \: u/ V' `) x1 n& s5 o# Q1 M3 X6 l+ F5 K6 s" D1 W
} catch (Exception e) {}1 J+ h* R: H. M: Z0 q) h( q
9 r0 o* i5 e- e- F- _: t- W0 e, [ j
}% l- t9 m. \: B. E
3 J9 f; e4 y7 N" W/ t. `- }* ^ Y: R
}1 O5 I7 \; @4 S6 z4 G1 t9 e
8 Y2 {0 I' L) r( c& p(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
- c2 [) a( b( }: E" t& q/ b0 m; D" W1 J/ r1 ~5 b; d
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
- ?" r$ o6 p6 o: I! {- l1 u: ~" ]" `' @: C1 C% H
基本的 XML 文件
) \. @$ B7 y: R5 [% }# R6 c( G$ M0 S% D( Y, b( C/ E3 X$ C# s
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:$ f# k( ~- W: u1 \: I$ }. A
3 p; y! u8 c3 e$ h; r- o) R' u, }
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
& i: W$ t8 x3 K4 f+ N8 e
; K1 I- B' ]- y- ?4 X: E* X2 VDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
# v! g5 |" y7 c5 m7 y/ A; w( g* r0 X6 W: c. U8 A
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
2 t6 ]$ ?* |8 C8 A4 u r4 w
. ?% x8 H- a; w e<?xml version="1.0" encoding="UTF-8"?>
: J; o. t' O# f: C8 v/ s2 D' K1 B9 v. U B$ q# i: _4 s; O8 o( K
<!DOCTYPE ORDERS SYSTEM "orders.dtd">" w' |! f \* T
% E8 \! M/ n& q6 ^* O$ H) C<orders>7 Y* j$ {& f+ o: F' t2 \6 k, b
/ z/ h! \7 S7 e: ~# \0 s
<order>1 O, o! M$ V1 u" ^9 p t D
0 L6 G- |8 E5 j1 z; z G <customerid limit="1000">12341</customerid>; M% p4 d/ q/ S
8 |7 Y0 h0 \5 I
<status>pending</status>9 r _2 ]% @$ M% q+ T7 P
- ?, W" D% r$ S" D; l5 G <item instock="Y" itemid="SA15">
; I' G; I1 M3 \ M1 F8 ?# \, ? Y6 W) H% V1 P
<name>Silver Show Saddle, 16 inch</name>
7 D8 r6 I7 L# B/ D; H' ]3 ^" }* T+ W9 z V: d
<price>825.00</price>
4 _1 v' N* S* W1 P7 \/ l6 b6 Q( i* D8 Y, z `
<qty>1</qty>; \, U3 q0 Z6 {
( U! B: s1 q7 }2 G; A </item>5 f. N0 z# s+ g7 O0 f
2 \4 n, h y. O; ^2 v! p
<item instock="N" itemid="C49">
( A) r* c4 ^3 u' i( e" t
7 q0 O# U* R$ d |9 z8 ? <name>;Premium Cinch</name>- e$ ?5 a& I3 |" |! C
: L% H6 V8 O' \. K: S2 E; O$ N <price>49.00</price>
4 N/ k6 {- n, c! w
b6 R( d8 M V+ g3 N& i5 L: i! i( W <qty>1</qty>' D- t% W# g) s. z/ L5 y! V
p4 ~; e7 E& U) W8 u7 V </item>8 \- ^, p6 X& S# ], u
& q/ h9 j) A l( ] </order>4 c0 n4 [2 G* v2 n: |+ P o0 n" j( o
7 |2 m: F( i# J4 {; Y: _; t J
<order>2 r8 P; n$ l5 g
, Y# x; ^* I3 ~/ g% n7 A. o1 F <customerid limit="150">251222</customerid>
% @# ?' D: n' S" H0 C4 t" f
! H5 ?- h0 h% Z( b* X R* w <status>pending</status>
3 d. ^7 [4 Q6 ]4 z- B& g2 y7 i- }# z: @. N. S$ [. a
<item instock="Y" itemid="WB78">
* b9 @) D8 a) N& R) g" ~% k% P; o0 Z5 u; M: d
<name>Winter Blanket (78 inch)</name>3 }# n, E/ g# R# }( G
6 X2 o, R: y; } Z7 i <price>20</price>
$ }- }5 T( G6 H2 M; k% f2 k1 |: D P, |& e7 j
<qty>10</qty>
6 n5 f/ Y. J$ O& M
0 D3 c+ f7 B# j; W6 ]# J, c </item>% G+ F5 ]# r- w, O" c% e p1 N
7 F- B7 s) M4 S
</order>6 s* q6 s( p3 W7 m0 w2 R4 _1 C
4 h! ?3 B. c; ? x6 S- C</orders>
0 Y' K. d1 u% i c在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|