获得本站免费赞助空间请点这里
返回列表 发帖

DOM的一些概念

5 Y  l! V* `4 }
开放分类: 互连网、网页制作、web技术
6 i7 @8 j. [- l' u4 o/ s# H. Y/ `DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
# v$ h4 |& A" N  m" `9 p5 ~! _5 L% g8 T( C2 \/ I" w! z
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
; E' h3 E( L7 c! I8 H6 x4 N1 B6 p* R" b9 p. j
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
" c. N; q: D. V: H" _1 u$ ESAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。" f5 i' Y7 J* W' Y) t
/ E8 ]8 {7 O6 \+ S8 ~
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段6 m4 Z5 O- O! y0 `; D, B3 a
! ~% k7 r0 H- M  v5 V9 j: q/ Z
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
( F- |/ }! W. g7 [8 `
" ^8 H+ h" f" M# [) j2 m+ c1 @* z$ S作为 API 的 DOM
# q+ x3 c- t0 |- M
2 X/ n3 ?8 Y7 U  Y从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
/ O+ S# e9 y+ W8 y5 C& \% Q+ E4 ]6 b  C  E
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
, d. i9 R2 G" K3 m4 K7 c
% P3 O7 o3 J/ SDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
! X8 n/ P# m' W/ |/ z
0 {. c5 {: k4 @  |9 Q- y7 F4 g6 Y+ n  ^' K当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。5 J9 |6 \0 _6 C" |- C: }% {
1 X+ L: p  N9 u
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
( R4 g: v+ d6 u1 ~' R; \# A6 H  Y1 b
确定特性可用性
" T: a. {8 I# x  L9 w# V' Q7 C2 R0 D$ t0 e9 l
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
$ ]& F: N: C( Z/ Z. T
0 e+ `5 L( `* fDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
3 T8 A7 C4 _4 L& @! i4 Y: O1 Z6 Q7 E. c! i: k. u% R6 E
import javax.xml.parsers.DocumentBuilderFactory;
1 k8 @# B1 p9 ]& R6 J0 m
) w" @' {3 ^$ }2 y: Jimport javax.xml.parsers.DocumentBuilder;
% d1 L* E3 z1 y  t4 @  E1 }
8 z& h) ?, k$ [! i! i- qimport org.w3c.dom.DOMImplementation;
  Z% q% R( T, E# w1 ?2 U9 z- A( R
public class ShowDomImpl {. K$ @& y0 @8 {) b$ D7 a* _

& V0 W, o1 s9 J2 M" k: u9 W( Dpublic static void main (String args[]) {
# I: L, P8 U/ d7 D' R  }2 y1 ?/ A) K
try {( Y4 ~0 n' j& c

) D% J# h/ @1 O& X& fDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
# d, z8 J+ b0 b* Y# E
) d' t# g0 y$ A" ?* N9 oDocumentBuilder docb = dbf.newDocumentBuilder();
4 d: ^# l; Y  t1 y0 T" x( y2 A3 T7 M5 G2 ]) V8 m- e6 t2 T9 V
DOMImplementation domImpl = docb.getDOMImplementation();
+ q; Y3 }+ w8 q( K5 ^5 b* h9 |0 G( d+ I) e. r) a
if (domImpl.hasFeature("StyleSheets", "2.0")) {
$ \. f# D( O- k1 V+ K4 I- X9 w5 |: D& y' S* \3 ~+ k+ c' j
System.out.println("Style Sheets are supported.");# B5 v( ~4 p6 Z5 t4 U; I/ s2 n
9 M4 r% D: h* M
} else {
; P7 {: P6 I  F6 t! P: a5 }) z6 F  w' }) l2 Q1 ~
System.out.println("Style Sheets are not supported.");
5 L$ U8 S. W* m1 [/ h) K/ X9 v- l  x8 ]) n$ z: |2 v
}# ^$ h. B  q) ~3 N; @

, g" n2 J8 ]; ~$ X} catch (Exception e) {}" p) h6 m- r1 X+ T* o3 m

) G  l8 N( Z; l" Y" A9 O& Y}
; B; S$ ]2 d" Z. Q7 N
: T$ f' P( x' R% c& q% |}
: [' {/ m, t7 |+ g: h
! W  p3 S+ J5 C1 r* s$ n(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
! Z' p: K: w( [+ T/ t& [! s# \7 Q4 J' u; D, d; B! L0 p
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
& x" G' T. x2 P6 ^& s2 Z" P% f8 K$ t" t! J. L
基本的 XML 文件' N+ A6 |& l( A: ]8 a( J! y
% k* \) U. @) B
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
9 I6 H7 C5 N6 D
  Y$ I- z  E4 P' Y4 m+ [; hXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
; M  Q- z  ?6 x2 L" _" n3 l' o8 }- a) U1 N
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
. e9 P3 E" J+ |0 U) x5 D6 m" Z2 @$ r/ d/ V* K( r% K: K& M
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
5 m  \3 S( _( \  }9 x4 s7 k
, Y7 L% Q' i, I<?xml version="1.0" encoding="UTF-8"?>
5 {. @8 B+ T% A/ V2 @& g* n: W- ^# \  U
<!DOCTYPE ORDERS SYSTEM "orders.dtd">* G6 J  ~! F$ C) h9 w1 Y+ ~
; |% I! K6 B0 P9 V
<orders>+ w7 h6 i& l7 W; w
/ v: f* l* j9 s) e' z
   <order>; z9 f- }0 V' l. ?3 r
5 k+ ~9 z) w3 N0 r' f' a
       <customerid limit="1000">12341</customerid>
6 j% s% A' p9 P; C, o3 h; Z5 {: T
       <status>pending</status>. U8 C0 X% J, V) _2 z
5 e& [! F; ~& P' ], u9 E( r/ s
       <item instock="Y" itemid="SA15">
1 s5 w% O: G' ?5 t& X3 C
; w; d  u, K, u- ?/ c          <name>Silver Show Saddle, 16 inch</name>
* H: t: q( Y" h% @( E6 o( u* ?  q! y% N  g1 y
          <price>825.00</price>
3 S: r6 Z+ |/ M: _' d3 g
4 O, s- ^4 f; o1 r8 ?          <qty>1</qty>; H2 \! [- g  v/ C' \, `6 x

4 v/ x) n/ e* b5 j) K6 {! z       </item>+ r3 ^0 I5 I" j2 \! }& D. H

6 t3 A0 `" {* G$ Z7 ?       <item instock="N" itemid="C49">
! F1 U) e. [* U; O- o8 s
" t9 r) l" t" g/ o         <name>;Premium Cinch</name>$ q4 E# M, S0 V9 ?$ i& d

6 ~1 p) l; B9 V+ ~4 X# ]2 e2 I; ~. G         <price>49.00</price>
" \9 r9 w' q7 o1 Z" H' W6 C4 R# p' A6 n4 K3 f9 |2 }' D
         <qty>1</qty>
- q; ~2 y+ n" l2 _( Y% G- I6 u! {+ B/ z. @3 o
       </item>, l5 J. F" @7 m* z& P

" `; I4 ]: d- M' f1 t  </order>8 n4 P. F$ s! v9 B* K$ m

# q0 j: V3 f2 B! ~$ ]% _7 v" ?<order>2 Y, I* r; K0 t/ k+ K4 C; s

. J8 P8 o& V5 H! x# C; J   <customerid limit="150">251222</customerid>) R& W1 w+ K5 y: h& H

! J+ a) j$ V3 f* {% k% O% h   <status>pending</status>
2 Q1 r. C8 O. j+ }3 \
" }5 h  ?* y- d( |' _+ q% H   <item instock="Y" itemid="WB78">( U: f# S# m- c

: ?7 `9 H  O% _4 h3 X- y     <name>Winter Blanket (78 inch)</name>
. i% S$ e' z6 N" h* [/ ?( {0 j$ P4 u2 c8 T$ z. z" u
     <price>20</price>
& ~$ T4 f. U8 X$ L/ Q
" x8 n8 |+ b3 y% e0 N     <qty>10</qty>
/ ?1 v8 c5 f! d% J
4 @, [# d3 R. Z9 y+ P4 `   </item>
6 `" Z' f5 u0 A- |0 R% v! Y/ W# k0 a8 ^
</order>( g0 q/ ~& g' ~9 a5 U( Y9 H

9 {- Y" p: a- j4 X6 s' k) T% O7 W6 Y</orders>
/ P) I9 w( I% Q. Q3 G& |在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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