返回列表 发帖

DOM的一些概念


& G( i- b( M6 B* D% G1 j: C开放分类: 互连网、网页制作、web技术
# D+ u* S7 }) O8 @DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
! P8 X8 t) U  z2 _/ g0 r7 C) y4 {' u7 Y( a9 r
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
, G" Z7 o& N6 M. J* M
' ~6 j& f9 r' @1 [' {2 m对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
3 O1 t) e0 I* C: A+ j2 ?2 wSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
+ n  j) Y. M& J2 p' T9 J: I2 h! J' U
$ N8 \* N0 J2 W4 e/ o另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
, [2 m+ M5 `$ d5 F% m! @
) u7 {1 o7 v6 ^2 g; o; b  R5 @5 d解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
3 w, ]6 o, |! i! p2 |" I8 U& ~8 [; x7 z
作为 API 的 DOM
' r0 `) r: R# T. Q! ^" a4 B! A- @% Y
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
' T1 I6 P0 y) N- |- K( }: ]0 _5 {1 I) u5 ]% n& O/ t. u
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
) b% F" L7 g4 ~$ H  y/ O$ H$ n4 H- Y  u* f
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
  y3 u1 h2 b7 c. l5 p' k
4 r& B6 d# F6 a- d( S当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
) S/ Z$ v7 f* \, {% Z: ?" `- N6 o# C% b  \
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。" ^, V# f- d) W  g
2 O0 |6 t6 }5 L+ Q
确定特性可用性+ @; T- c% J- G5 O
) q# B9 d9 w  u
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。2 J) s- M9 V. r  ?. b4 |
& V6 c4 C6 F! [; e' K3 M% T
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。1 k: ?. F# I. o) {( F

* ^8 Q2 m7 Q! jimport javax.xml.parsers.DocumentBuilderFactory;9 E+ N- d0 V* A8 }" l! l

5 a. l4 _- }# ?) }9 V9 h  Kimport javax.xml.parsers.DocumentBuilder;9 C# S6 E0 B9 M. V1 I
! X3 q& `- B$ i$ P+ ~3 T
import org.w3c.dom.DOMImplementation;9 y! {- o/ H" d: F) _$ ~, T
" k0 R. h% z5 `: _) V8 X
public class ShowDomImpl {, }/ ~4 L, u! t& E+ }( o
8 _4 j8 D' j* N" U
public static void main (String args[]) {# ~* P$ `# y& Q0 g: P, D
! k2 m( s+ ~. F/ q3 h8 R1 w# U( j
try {
7 u/ p7 ]0 C4 h
# p$ r# {  y3 B- n7 \DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();9 c5 G6 j8 ^, o) L4 P2 K( d
& ]# I1 L- V1 n$ r% \
DocumentBuilder docb = dbf.newDocumentBuilder();
7 Q  G# o, u9 \, {$ F' p; v5 G
" b2 @$ {: w) UDOMImplementation domImpl = docb.getDOMImplementation();
1 f% z# s/ v  U! w6 @2 C2 Q- ?4 c4 r- c
if (domImpl.hasFeature("StyleSheets", "2.0")) {
( J+ [8 f3 S( W. S) h, s; M1 [' i5 z0 ~+ z( L1 q
System.out.println("Style Sheets are supported.");9 j" ^1 x! V% m9 C6 }
7 M( [( p2 t, z  w) L2 F9 z
} else {$ Z. E3 L# a" b9 J# H) W
( _6 D# P1 H% C2 o) A
System.out.println("Style Sheets are not supported.");1 n' b! X3 M. h2 d0 R) I0 E

+ \! D+ c1 Y& r) k0 a}7 t1 d. G4 W; Q8 B

8 M2 P2 l1 _" L} catch (Exception e) {}
" f8 G6 U( `- M5 \" s. H6 P5 z- H, R7 q, h! ^& ~+ K
}+ M9 w  G& i" X+ q
( L& R, e/ v* ~/ @& u' e# g
}6 |4 g) [# U. }2 k4 A4 z4 v0 _. J

9 @/ N' t6 a# ~) w5 y- C(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)6 z/ T! t' o6 R, B: ~$ t

" I% l& f3 {9 u) N本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
2 D# j9 {2 e8 T& `8 i; \6 [4 h; P5 E$ d
基本的 XML 文件$ r1 A9 m# }7 r# M

3 Y% S* I+ |/ n" _# u9 F2 G% H2 h本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:$ ~4 W! o" g9 e& ]! J

# q7 s- x$ \4 |5 V& P7 @: D9 aXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
4 z! [1 r  q: @; z
$ {, H+ W: ~, m) QDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。" V1 W3 r$ y7 ]# |$ @/ {
/ k* u/ Y% V- k& `" K+ ]
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
8 _0 B9 r1 J; ^  A5 D% J
0 ~3 `7 |! F6 s8 f7 |$ V* z<?xml version="1.0" encoding="UTF-8"?>/ B, l* i1 Y2 x7 k

2 }. U; N% s: U5 t, K( i% V: t2 u<!DOCTYPE ORDERS SYSTEM "orders.dtd">; H3 {* ?1 l1 Y: T* O2 f
- A" m5 O- ]/ Y& C0 d# V  O: V
<orders>; V. J8 K( K2 P; Q) i1 M
8 [5 z4 u  I. N! N1 w! ^$ r
   <order>5 Q& Y% D: u: m4 }
/ ], }+ w  n7 _& p3 ^: `
       <customerid limit="1000">12341</customerid>
; N( O( x+ E, g+ x9 `0 @$ ]" I4 C: n
       <status>pending</status>0 N9 {* q0 n& S+ q+ f& v' e

, e$ T* P5 n7 E& l5 s# o0 w       <item instock="Y" itemid="SA15">% W& R" m5 c: ~

9 a8 v/ ?& D/ X+ f          <name>Silver Show Saddle, 16 inch</name>8 r7 P0 ]* S* x/ f9 ^: i" f

1 [  d. G& X3 Q5 u. x5 ]          <price>825.00</price>) P  H) V- F6 N/ t4 t

! S: H6 e% K6 r, o! v0 E  o          <qty>1</qty>% n" a/ C: T- M0 _- U- L; q; f. C

8 d4 e/ l# s$ B       </item>9 g! \! _5 @5 R) j* G' K9 O

2 G7 g# p7 Q6 C0 W3 X* r       <item instock="N" itemid="C49">) q0 Q$ S& h2 J3 H4 L" J# R

# j1 {  s/ R* n. c  E8 s         <name>;Premium Cinch</name>8 |6 P# V, s! Z5 w

1 B: i- \3 ?% I! H         <price>49.00</price>8 c0 w+ J& u# ^" Y0 J
  U2 ?3 r% n3 R/ Q
         <qty>1</qty>+ m1 `& V! G, L: D

; X. X( ~3 T2 _* O       </item>. \# c/ N& z" U% G

9 D; v1 u6 d( `; \/ w' w' X  </order>
+ K! _2 C* {0 h1 j
5 i/ l9 ?5 v1 E: I, P<order>6 [: h0 T7 p0 ~# l
$ A' X" G2 J+ o9 a
   <customerid limit="150">251222</customerid>! |7 k) n  e- A1 Z% W

) D1 L. g) o7 c2 K   <status>pending</status>$ j5 j' W3 w- E0 I. z2 {3 X6 s
( h  G! X8 K* Q' g; u# \/ K  V- v0 x
   <item instock="Y" itemid="WB78">
* Z0 e- M4 n! [; g( S/ z* B# v6 q: `
# Q* a% q) q! ?- h0 y. K     <name>Winter Blanket (78 inch)</name>
; P& S- A- _( M8 t/ k; X) E4 c% F' Q7 M: k6 K3 `( z6 r
     <price>20</price>
' |. k3 M6 _% W$ B% M
& S+ q; X8 W% Z" R0 S     <qty>10</qty>
1 R( Q! c" B' x& r( ~1 @: [6 S8 w( Q+ ]6 A1 i+ s% j7 |
   </item>
0 I0 P- c; O- h$ S# H- W: H* B$ v$ S# f
</order>
& R4 {$ H4 X& Z* |
" L- G& ?1 q7 Y' r, k</orders>4 {& S' u- T9 I
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

返回列表
【捌玖网络】已经运行: