|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
* P# @3 f* W1 y0 K1 n& i4 Y( \开放分类: 互连网、网页制作、web技术
: \5 ?) B0 a: X @DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。& s" K5 O2 n: b8 D" s% q
5 O9 M0 @& x R5 [DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。9 ^1 g9 {6 N6 I3 k$ V
+ O2 k6 p' ?, Z' y# ~& J对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
3 {/ ~: A" t' e# xSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
0 ~0 @- t. R/ l+ c
5 u6 H6 y, n2 C( S k# H) Z另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段. o* j/ ]0 H2 v% i. {0 q R
" {- }) |/ O) r8 W
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
# o6 f: J1 A! k
* A% k% u* y- G% \作为 API 的 DOM) Y' X2 m2 p0 X: N, z; w
. @1 q5 |/ Y8 T& u& }4 g- e& s ?5 e8 \
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。! J! k2 Q$ S, ]
/ O) l1 L/ w3 H' ]% t* ~* W+ yLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。; D- x3 L$ R* `/ U4 j/ m
" |' r: y0 m/ C5 q* eDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。$ P, U# ~; O" q( J+ ?# p
8 i- W& k6 c9 P8 W9 O
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
8 Y* p% p3 n* p f& a" ~# g; j0 `. P( b% u6 @' Z8 C: Q
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。8 T" b4 X; i! ^" n, ]
% y& \4 T" c: {, v0 A+ m6 `/ s8 U- o确定特性可用性
4 b0 t: f, ~: ?
( g# g/ z2 t& O# jDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
8 P5 S# |; K+ c( ^4 {/ g/ n9 L# v' w2 C7 p y8 F9 G
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
6 V7 g0 k+ n5 ^' L5 w
( Z5 {; t( G) z9 a( y0 N# t$ cimport javax.xml.parsers.DocumentBuilderFactory;2 _ A! q7 J8 `8 @# {( |
" r0 N% s i$ W/ x. ?; x2 `# X2 O s
import javax.xml.parsers.DocumentBuilder;
# E* C0 w1 i! m. k
R( x* g$ m. l. Y9 W+ Aimport org.w3c.dom.DOMImplementation;
; L# Q4 I: j/ ` b- j9 f* K2 G9 J) g8 z8 |
public class ShowDomImpl {7 j- F7 j1 D$ u% S
" r- D& Q$ t, _1 T4 c3 p
public static void main (String args[]) {8 {" g0 d" \( ]5 O* K: Z
$ x/ L7 @9 i/ N7 c3 Z0 a, s
try {
8 _) ]0 t6 x7 m" v* t, l
% }* [% i4 w) o3 N7 cDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();+ P$ s( K2 E5 x! Z* ~
: V. ^0 J5 l5 Y- c. [: w/ X; q ?DocumentBuilder docb = dbf.newDocumentBuilder();
7 Y4 t8 `- U' l- B7 a& P/ y3 `1 t
DOMImplementation domImpl = docb.getDOMImplementation();/ Z& ]2 c0 } r, \% t
+ {* l. U8 O3 u4 ^
if (domImpl.hasFeature("StyleSheets", "2.0")) {! _+ `3 W3 e* X1 U7 D
. O% r8 l! k; L& {) A
System.out.println("Style Sheets are supported.");
/ o3 J6 u" k: ^
- n% c& w/ }$ `8 x} else {, U( J3 e. M6 b4 Y
8 u- \! A' F: G! B
System.out.println("Style Sheets are not supported.");7 N% Z7 Q7 s+ N3 z& p, k4 F" u3 R$ I
/ [) F7 A2 g" l3 `' z% @
}
6 u: j4 }* n& W! p' @/ T! k7 a2 J! T, V& q
} catch (Exception e) {}0 P+ _+ ~7 D! j
# w. f4 m- a5 R1 ~. x! ^- R$ {
}: J" E3 M0 w; ~6 l( \" _( K+ s" e3 E) i% o
0 X; g7 G6 O# ~( P+ P5 [
}! H4 t6 h8 q' ^3 H2 V+ P
; p. H! G! u1 t8 a. n2 l4 f+ A(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
' J1 _+ Y$ ~! m- R$ e8 j
- s' j" m5 \# O9 X+ [1 J本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。' p% f: C7 s/ }% X1 Q6 H
7 k5 r8 ?* D! m+ @8 E基本的 XML 文件
& z4 P7 f$ i( P8 O/ ` K: S9 g4 K5 ^; M
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
' }8 n2 x4 D3 q4 ^) w
: ^% C2 m4 S+ Z3 d- i) B* D5 pXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。5 `: ~9 W6 g+ c- b
, L" A9 w( W$ R- p9 z
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
' }* v- E6 Z. z! U3 k
X) E7 @/ R& b' a: Q1 A数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。6 T2 T. t' M0 H9 {, ~5 B6 |8 g7 Z3 }' h
$ }( r. K5 I2 k( ?5 k<?xml version="1.0" encoding="UTF-8"?>
" |$ U9 D" R* I6 l7 Y1 T& P
0 s# K. x5 S3 A<!DOCTYPE ORDERS SYSTEM "orders.dtd">' X/ i5 m" a+ T6 w D$ h" `
6 `. T1 d0 m* t2 R9 }9 g0 `
<orders>6 u( C5 Q+ m6 @# Z8 u
- K$ W7 I, Y6 {) e% W( ~' Q
<order>0 c# ?: q q7 `2 @& a; }% r# [
" ?' h5 v0 @6 B2 [/ J: S/ v) C <customerid limit="1000">12341</customerid>+ m2 H7 E7 d+ g. R
$ i3 L% U% Q. A v3 q2 D
<status>pending</status>
0 _4 ]2 } v1 g E$ t) ]) M) a. p6 `& L
<item instock="Y" itemid="SA15">
6 @' e2 r2 ~ m% G0 @/ B+ ~* }, o& j* j* ?% s
<name>Silver Show Saddle, 16 inch</name>3 W x) J: Z0 E& T- C- `1 O
3 M8 Z4 A9 u0 q" n2 R- x <price>825.00</price>
+ _9 H$ I! z: t+ E. ]' N& v0 `- R* B* B$ c" G
<qty>1</qty>
4 I/ ?$ J4 d% R! y3 x0 J' [3 c1 S, w; I+ `/ t9 G# q
</item>
" r5 O9 ?; X3 O" l! t7 D5 a* u9 u
<item instock="N" itemid="C49">3 M% V/ q2 S5 A
0 [* l' N: h! y9 v, h% c3 X <name>;Premium Cinch</name>
4 }2 j9 E5 C4 S3 a. R, k( I( i
5 W3 u! i; }2 u# t7 R* G0 R7 q <price>49.00</price>" @/ M' z& F: ?
: y8 V; t% m# n. ?, l, P
<qty>1</qty> j) C+ t* b7 B- ~
+ O$ d9 w; r% q6 u$ @
</item>
3 N1 d9 w- ]0 f `! v4 D2 N0 b9 ^+ q0 U# Q
</order>* M' S% C$ ?" F0 U7 k
! K1 i+ n2 d! \( |( I, y
<order>& N* V* l) {" o7 u9 K
9 F& w8 n/ E0 {# G, G <customerid limit="150">251222</customerid>( F; y- P V: U: l( x* ]' \% K
5 M% C$ ?# v% H+ C7 ?, h <status>pending</status>
% o2 v p3 u2 A0 Q( G) V+ X
2 ?, s" X6 O$ X! R <item instock="Y" itemid="WB78">
: O: N# c( ~2 O% G+ w4 L3 n& }# l5 H( S/ J
<name>Winter Blanket (78 inch)</name>
9 w' U. Y; H* L: x
* }9 Q; b( N# Q$ ^( y3 H <price>20</price>
; S) i( ?- ^! V5 e
' l$ Y' k+ B9 I/ |, \ <qty>10</qty>
5 l3 D- }6 h3 z
( q& J( v A) K </item>
* n5 ?, ~ X* Y/ Q9 w0 f% X3 d# S& e3 ~3 A# a1 f* F8 f
</order>
" n- G2 d7 G: l: s t/ W- \1 I; D- n9 \: C, X
</orders>2 M+ R% n1 U2 d# f' v
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|