  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
4 t; E+ U' u5 v$ S
开放分类: 互连网、网页制作、web技术
A0 k$ O9 g% x& I2 a/ L4 kDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
' E, ^& w( J7 I- I, Y5 x+ @* P) c' n/ M6 l
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。4 x. D& H7 v' y$ |% j6 }# y
; \( z' d7 z5 q- R' n! I1 A对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
( {! Z: k3 {1 {1 o- o' TSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。' `6 U# ]8 w5 A- z$ J$ k
& n) R' e8 i& Z2 D2 m: Z& R+ t
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
. K% v# O G( ~4 g' T3 t1 S: w& m! {9 D% h) s
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。+ Q7 g6 h/ V5 T8 o+ b
, y- \* O1 J4 d, K作为 API 的 DOM
/ O& d, o0 L5 i5 `4 e
& I* _! S( |7 A! z从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。0 _( }( s O! n- d% A
" b6 `7 e9 q& u. Q9 F4 d7 [1 P
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。5 m+ T# ~% J; s/ d6 E2 F3 g- ^6 M
6 Q* Q/ b, t& e, }DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
& }, L) l/ g$ ]$ ?$ Y% Q; _, ^% @ s8 R& I$ |: q: @. J) O
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。) V& {! ~$ p2 Y, O6 ~6 W* ~4 g
: a% u2 m" n& ~3 N( J1 ODOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。6 \6 @# W! C( L& v0 x5 X
! N9 i9 m- e) D1 M9 J$ l& d+ W
确定特性可用性
+ d* }+ p9 K8 O; x {1 @" r
4 }' n, V3 k& I7 Y; @DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。- ~9 Y4 A0 D, w v& V4 K: l) o
; i4 p: b3 T5 b, _) U; PDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。( @$ T; y$ |4 u8 J
' M5 l/ ]; d" T: \4 T9 Wimport javax.xml.parsers.DocumentBuilderFactory;5 U: G) ?9 O6 }' @4 K% i d% M
8 D& `8 |" ?5 K4 l! Himport javax.xml.parsers.DocumentBuilder;& W$ X' A7 H+ d9 Y1 ^5 s: U2 k
% E9 p# M7 I) ~9 D, u- q. B
import org.w3c.dom.DOMImplementation;
5 t5 c( X0 D$ f! \; s
* L) U. R( b2 U' @3 F/ i; qpublic class ShowDomImpl {" ?) H1 ]/ @( ^0 S% H& f
- u" `4 J& L# \+ r
public static void main (String args[]) {( s& _' O+ i7 `3 h" o
! R3 u; T2 S& Q9 ~
try {
; j( S# f! I) b4 Q& p) x6 r
8 F9 H% j# E% ^. k/ u/ o* sDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();% k9 d# c% h$ N/ B4 Y
5 S0 y( o' K' G& X
DocumentBuilder docb = dbf.newDocumentBuilder();9 b( [6 e6 Y) h, A- T( R
+ R! u2 j, t- A+ M6 B7 kDOMImplementation domImpl = docb.getDOMImplementation();9 a+ H8 @* B) m3 u8 i; l
9 t6 W. J4 l. xif (domImpl.hasFeature("StyleSheets", "2.0")) {
$ f" f) p8 n7 R. Q" {: @' B6 S1 j! X4 L: q- Y
System.out.println("Style Sheets are supported.");" h" p, Y( |, J
$ u1 e" B: e4 l- N. h5 G
} else {
+ h/ G( h- Q3 m) b4 v4 g: @ H J2 _% P$ Q
System.out.println("Style Sheets are not supported.");( D; N& m1 p2 S2 B- N6 {9 _# ]9 M
- e& P) a! |0 a) W, s
}
" H" v! a. ^& ]+ F# n/ Q. P) m2 l8 ^/ g2 x& u: r$ n% M4 r
} catch (Exception e) {}
" |# S0 D, y& t4 X
1 M v4 D: p+ H; W}$ z7 |1 V8 N4 q% o
% s$ P- S* g8 N& q& O8 L) U
}
0 ]+ ~+ ]2 w: C5 U6 g! O9 a6 r4 ]
* o& i: w( j3 N* f+ q7 U( g D; e7 K9 L6 M(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。); T6 R; l2 d- V6 ?+ [! ^& n; k
" o/ h. g v! D* q8 g6 ~
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
0 Q W% |5 A0 @2 E* p' v/ X3 h/ Z7 e
基本的 XML 文件
; D# d6 r l+ ~% N/ _% d' b9 u: {& z$ \& p
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:+ W$ L0 k P! W$ V/ _& W
& u' d# w# ^9 \ h8 b* B: ZXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
0 Q- Z9 L( _ Q; l; I! p
: ~; F4 R! g; h rDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
$ u x" S' y. N5 R8 g4 n
7 V" y& r0 ~, V6 O. v5 m( _数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
5 B: ^" ?* Y1 \4 h1 L/ w" h
9 s& f/ u& c: y$ j. d4 u# M<?xml version="1.0" encoding="UTF-8"?>
) t/ h* j# O$ i5 i- S3 ~' V$ R5 U( v# R5 X5 \7 \) E
<!DOCTYPE ORDERS SYSTEM "orders.dtd">. m; g8 M5 \7 G( F# t; `
7 a' @0 D- Z: o' M( ~6 o
<orders>
* z: j ~ i( }, ?' S4 S+ n5 `* W( U
<order>+ N( `) w' p" d% b4 U& N
9 N7 o' L+ V. @7 R- U( G5 P
<customerid limit="1000">12341</customerid>
" @* k, s( d9 K; N/ T Q7 F( c3 ^1 K1 r8 G
<status>pending</status>6 f, w% u8 R2 k2 T1 p
! v7 H+ _& |- V E, G& s1 x <item instock="Y" itemid="SA15">1 S7 W: Y& W8 g& A& v
" q! F' ~) R1 O4 A- ]6 D6 y
<name>Silver Show Saddle, 16 inch</name>* J: _# G( I$ Z! U+ Y I
3 K% X( C" j/ L
<price>825.00</price>
9 r' E2 d) u% [
$ F6 e) N+ ^! A p: O% ?7 x <qty>1</qty>
5 H( O5 a2 c, T
- f4 _1 @6 U. R8 n </item>
0 O9 M# d) h2 x* q' v+ u7 e% Z* r* _: U
<item instock="N" itemid="C49">/ O L' V" F2 V% Q) T$ F1 g- q9 ]
$ C2 ^7 [" ^$ B! F0 ^8 R1 E# F, } <name>;Premium Cinch</name>
6 Y$ `1 c" |6 |2 q" v7 E
6 ]6 `1 n0 l0 F* _2 f/ u$ R% C <price>49.00</price>) |: w7 |% p9 f! G& [' j+ N
$ N4 F. L9 `5 z, v. b
<qty>1</qty>. t8 ~ K: e+ z2 E
4 f7 C1 m2 \& y* O
</item>, J1 D; O- C: C( a3 j+ J Q
5 U: P8 w) l8 C) j# e$ C
</order>
! O1 u6 N+ Z* @# i1 l# j: E* f1 I9 o7 f! H3 x6 ^
<order>: J3 o9 K) d+ R' k3 ^/ }
4 Q, F1 @& Y U6 z4 ]. p" b" q+ w! N
<customerid limit="150">251222</customerid>5 Z7 f1 o' Q/ x2 @. W9 c5 M
- B& k1 m' U/ Y- g# j) q" x <status>pending</status>
k! a# c: M+ H1 h/ j) _
& A$ d( t1 J! n8 y; a1 \. T <item instock="Y" itemid="WB78">
' g5 ?4 |: {: h8 }/ M# {
2 }" a9 d# |1 z. U+ { <name>Winter Blanket (78 inch)</name>
% |+ x) @3 o: e& y
2 ^+ X5 M* I5 K <price>20</price>) g3 N2 [" X6 e$ X' b% \
0 O; |. I I A. C% g0 a$ V) H
<qty>10</qty>8 S* R6 v" z5 X4 L
/ L8 V' ~, \( r! H4 F! `1 ~ </item>1 t9 y/ Q) Y% O7 H
! x) K" }$ z3 p9 K' B, Z: S
</order>* o8 n' c3 a' @6 a7 y" } W
! G" j+ m' e9 U4 ^1 u# O
</orders>
7 E0 t. s, ?5 n0 @在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|