  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
' X+ L' s2 e4 v" m) ?$ r T
开放分类: 互连网、网页制作、web技术6 A# b! c/ H" a# o( W
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。% h9 j7 ?3 a s' [0 v- c0 i2 ? ~" b
9 W# n. ]& c, e& t8 i
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
, ?2 f, P8 n. l) k( V1 U* I7 F; @; B- K8 m) k2 Z6 A
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。3 @& y. E* ~4 k6 q
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
/ U: ?6 r. ^7 {: f
: p- P$ h. Y" b3 p0 s( z另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
' ~' e! A! h6 g3 \ c# A! z$ L2 [! i8 I( Q- l r8 g
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。3 F* j, m4 p" ~! B
/ Q) o6 D* P7 P' h9 E
作为 API 的 DOM
) y3 q0 b! p$ V/ T% m0 _* c/ k1 o% A) y, Q0 _0 L: O
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。6 X. O% P5 i% }% o/ r$ J5 j2 d: W
$ N3 | Q% ]9 B3 g- C
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
- t7 p, ]& z! {4 Q8 ]
% n9 q* u8 Z* [DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。5 m5 o2 S& p0 o$ H1 Y5 f
0 S ^& s6 {# I9 l3 u( \
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
" b) l) E+ v/ _3 {; Z9 T1 W2 `* m- A* D6 K) M4 O: f8 B$ D
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
" p, A+ ]) l" I. s4 o- t' {) J/ j! j- g# ]7 t% y( I: w
确定特性可用性0 q# s( F |4 ?8 b; f
; Y$ g! l: J- _' u7 _1 F( K' v& ~DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。* H2 z7 o* I4 ]) C
8 ^- E' U- j' f; ~+ j; b i8 e! WDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
6 k9 T* E6 D# V8 l5 b2 j/ z1 S4 s5 ?2 z( N8 ~+ p
import javax.xml.parsers.DocumentBuilderFactory;, }" h3 H i+ }, v3 L8 n
+ W6 S& o% m( @3 |+ { k- C, L7 Y# i7 H
import javax.xml.parsers.DocumentBuilder;" q( T; p( o) P' [9 q5 L- m# @4 V
9 N8 ^! Q' \* A$ A/ X, A, B" Q
import org.w3c.dom.DOMImplementation;: B0 P* T. x- @
4 d6 N; B) W+ [
public class ShowDomImpl {/ k( a8 Y! e$ m
; o( K; [' @6 P( a
public static void main (String args[]) {5 A1 w' n) \: d9 p M& N! d
% y/ p! f) E) U4 b6 s
try {
; k1 p1 r3 }7 \- x8 ~8 f- e+ X5 s% f) |
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
7 @+ |# Y- B( T$ f1 J
) Y$ }4 C# {- B. b* l/ YDocumentBuilder docb = dbf.newDocumentBuilder();
B$ R! @0 d. X8 J1 u3 R) O+ R; V9 s3 Q9 r+ p0 H+ |
DOMImplementation domImpl = docb.getDOMImplementation();. E" ]% Y* r8 O% c8 X7 l# V
: q% l6 |! |0 y" W1 gif (domImpl.hasFeature("StyleSheets", "2.0")) {
1 v/ K; G1 Q) t7 d" H2 B, ]7 C
* k. M0 G8 S! L8 Z. vSystem.out.println("Style Sheets are supported.");5 E' \1 A, O' u' r% H2 H {
3 j! I- ]( C$ i& U
} else {0 m% I, I N R8 p
& H0 w7 S4 J& o! o& y$ _1 Z
System.out.println("Style Sheets are not supported.");6 T0 B/ l# u* G
4 ~# r/ `- |6 i: V}
- g& |) T: M f. Q& g, B \0 a4 a$ E' U& D/ ]* i9 e
} catch (Exception e) {}
: M9 _+ S% v- n7 w! y9 l
9 w- O+ w& f( F: _+ |2 R% O+ j}
! R4 M% N6 w5 \# r" \+ [7 Y* S' n; S. s' a8 i1 j
}
" o' q" T0 M8 N! x! I
0 Y# `) Z. e. s$ }! ~6 r2 y8 W(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)5 T; e: G9 F; n4 ^) l
# s) w) r' s# |. Y |( D6 Y本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
; L3 U; D. \1 O0 r9 Q" v7 f8 I# `! f+ @
基本的 XML 文件; o- y9 t9 n! e
" j- ~0 q+ q: C5 T3 M0 A本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括: }7 A4 i" p, Z$ P& ]3 }5 `
- C; Q+ s% O5 O2 Y
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
9 k8 r/ w' ]$ l" Q i: y( t4 l) P1 p5 S/ y2 Z
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。) U* @) V( p' G3 c0 l. L1 o8 O
I( H f4 b* _, t数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。; }) \; Y- k6 ~# d, M: I
# ~+ f- Z% t7 m
<?xml version="1.0" encoding="UTF-8"?>
* h! j2 K! e4 V+ W' e4 I2 l9 @7 e- C8 `! N0 [% T" a
<!DOCTYPE ORDERS SYSTEM "orders.dtd">, R5 T1 M7 P3 m8 A) x* H0 r% o6 l
/ `, X* l) g/ J
<orders>
" c5 M7 c8 O1 {; m3 I9 B( x& J/ x0 I* Z* Z; W! r
<order>( G" s! F+ B* v W7 [3 K% ^
1 Q7 V5 i1 N( c9 o) |! K8 P <customerid limit="1000">12341</customerid>" }5 A3 L& M8 z5 `" Q* a! L
- _: F8 a7 M @$ k/ Q <status>pending</status>( h o B; \2 Q
+ u' u) m; F: H, M. f8 q2 J
<item instock="Y" itemid="SA15">2 \+ R {. F7 t
* b& T6 Q; W# v3 U( r( @ <name>Silver Show Saddle, 16 inch</name>
# t1 n/ m* ]: M5 c, E7 Z Z% M3 P
! r- C( |0 B1 E! S6 D, |8 \ <price>825.00</price>0 Y3 t7 i4 ^7 T4 m6 G) F; P& f0 h
: {1 ?8 f1 s; P5 A. k5 g u <qty>1</qty>! k: f; F9 @( G% M8 ]: P. s2 W
/ e" v. C& K3 g </item>
9 I* w7 d8 |% u, E0 F1 L# C- U$ Q" K+ o2 ]& {0 _4 m
<item instock="N" itemid="C49">
; A* J6 u7 m! R
/ G1 J: h: O8 w. `( I: c* O <name>;Premium Cinch</name>5 F3 h+ N U/ W8 Z9 G3 x! {
' R1 m1 H5 R0 ~. b) M: l <price>49.00</price>/ W. U0 _+ m5 ]- Y v& ^
; s( O# \ |* U5 V* d& J
<qty>1</qty>* S4 P7 Y1 ^5 e5 ?4 p7 a ^3 k
4 s$ t! r- z) v6 c3 i </item>5 M8 E" d- r; D) Z
" `4 q, r4 n8 Y% ~' R% b </order>- g1 E' t3 Y) H( D1 `0 v
" ]: T7 k6 r4 ~' D
<order>/ |1 c3 u4 h9 z- v( X# \/ e
( L1 u$ M( L) q+ L/ |( L! D: H: b3 h0 _ <customerid limit="150">251222</customerid>- }# z, h8 {: J4 M9 Q" c# j
4 U I& n4 q! e3 G
<status>pending</status>- D3 a" D* ^& K: J6 _8 n( ~
- p8 e! o/ H% O; @) L <item instock="Y" itemid="WB78"># Y# I4 m/ ~+ L3 I m/ D, z N+ y" ]
' [5 V5 k' C! H% U5 J9 ?
<name>Winter Blanket (78 inch)</name>0 j2 h/ ^' K3 T- _" E! a- v, T
9 i: ?) m8 _. E( I, Q( }, J" o
<price>20</price>0 b4 E( z" C& ^, a' {1 ?
7 N, \% u/ W& S$ b, u
<qty>10</qty>
6 V7 Z5 }+ p8 {* f9 O5 n( ^# |
' A% _6 Y1 E* J0 D \ </item>9 F8 c0 T4 @- L5 d4 y
3 L8 ~% I) [# }5 f, y) A7 c</order>( b0 @3 w- c6 ~# L U8 k
" u. W5 _7 a! d: J
</orders>( D a6 G6 g' u% Q
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|