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

DOM的一些概念


3 K( E) f5 j6 {  j( x* q4 M' H开放分类: 互连网、网页制作、web技术
* ]. D  {8 ~" e0 F9 B! PDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。* ~% m2 ]9 K$ P# }7 h) w' v) S
# x! |4 y! ?7 d' M9 m
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。! ]4 ]* V7 P1 D: k

# l% R7 i9 i9 z对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
5 p, l0 A: a& C; t$ {$ u$ X3 SSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
% i" c0 V% |  B: I6 U$ A3 f% F: e  A) [9 N
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段6 F/ O/ K% ^9 L" H  p
- k9 F9 p6 R- R: G
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
- @6 k! S& g8 k) z' |/ B3 I6 g; a6 ~
) V* N; A  _& d6 x5 s% f- e作为 API 的 DOM5 \. r3 l/ T' n4 V
. e( ?/ x: v1 n; [# }
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
0 A( ]" T7 ]7 _2 A0 ^- ?# r9 b1 [0 {: u6 Z7 @
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
! k2 R' |  |; I$ _2 l) N0 t/ d" u; s5 t- s
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。$ A/ _, L2 A( E9 G, Q% g
! e, y1 X' x. O- y* j% v6 m, I+ M
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
2 m! T! a2 h7 B) a, s' I/ T
8 U/ W. n- R& p5 n1 ?DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。$ b/ i% O8 |4 P/ X* o4 d% N& {

1 e# N$ E( l% u& Z确定特性可用性
, n. `- F  ?$ x9 m" D$ H/ u
. b1 y' F$ h3 w5 S6 W) R) ~0 f- {DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。3 O8 J8 V+ [0 ?6 }8 W9 s4 F

+ V# P& {# {6 p: H2 BDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。8 W6 J0 X" H  x: S3 \

/ ^% |, u' k% _9 k5 K& @& o) |import javax.xml.parsers.DocumentBuilderFactory;# N1 K  p5 S& U, j$ i. k

' ]: ]3 u5 t, g6 fimport javax.xml.parsers.DocumentBuilder;( F: C7 S, b1 C, n- c

" a8 {- W8 H& o# B5 a" M5 qimport org.w3c.dom.DOMImplementation;$ ]4 G' ^9 H8 B4 @9 d
2 y+ {/ u4 E8 ]; v0 g; j
public class ShowDomImpl {! G$ p' s  }; F  Q/ J- W0 q
* x0 z. R+ }. q6 z& c) z
public static void main (String args[]) {
1 `- `1 s  f, g$ {3 Y# s  U8 u  k& C! w3 w* k
try {: F* K" R+ N: G5 h/ [' n* y

% q( b& y# v, {* M. I5 JDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();' v. ~7 v2 N( _' E; M6 `
. S. @1 Y2 y, W1 f
DocumentBuilder docb = dbf.newDocumentBuilder();
3 w9 E8 T. Q8 O8 m1 T' h. Q* Y! @) R( d" Q) j) x1 F
DOMImplementation domImpl = docb.getDOMImplementation();' J1 B) T( ~; N
9 V5 u9 k0 w) T
if (domImpl.hasFeature("StyleSheets", "2.0")) {
7 |; W) ?% U. g" {* i3 E: E; G
9 k# U# f- [3 h5 ]5 ~6 ISystem.out.println("Style Sheets are supported.");
& H- W( N1 G2 g2 `$ u, j
1 P1 g: |' T% `} else {
& E3 i$ [) B3 g* G) B2 p! r
& r. r# k6 x1 y! @System.out.println("Style Sheets are not supported.");' Z2 Q# T+ \$ e6 p: l$ O! Z
- F) \0 l( j7 o5 `
}
- n5 p2 Z8 I/ ^8 ?
6 f$ d1 p7 X$ T! A+ Y} catch (Exception e) {}
1 b  W# @* q* j/ ^. r
$ j7 V. c6 Z7 d6 A% e4 b# q1 g}
9 A: i8 h! A  `! R5 Y$ _/ _) t2 d1 W$ y' E
}
9 C4 s0 [- L2 `7 ^* t( X
  J2 v1 T: I5 g2 ^8 f(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
# T# h) @2 e- N5 z. b& }
1 o& ]; X3 [1 U' t. ]% k; E本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。$ V! }, k9 B/ X4 c& D
5 O; x! X# b' g% M
基本的 XML 文件8 d/ Y4 G5 c) z* F: I5 Z
2 B7 x% [" o+ A' \
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:" l4 `9 _5 u6 x: q, d+ ?

( W* h+ H' ^/ |; XXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
% l. i( x* r& d# Z+ j- m
' Z. e& n6 O" \( hDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。0 w5 T% }, h# ~# k/ F

7 P7 X/ c* N: G8 j数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。4 |8 y; V& h; ]& D

4 ?8 _& q9 ^+ S( X4 |6 ]6 V<?xml version="1.0" encoding="UTF-8"?>1 Z, D+ u6 e4 v9 h& r/ Z& g& C* p

1 S5 [( e  m& N  f, F2 h1 ]" t<!DOCTYPE ORDERS SYSTEM "orders.dtd">
! q* [2 F* X5 `0 K
4 |) T% W! w5 U, ?  e% u# b<orders>
: x5 `  J8 r! S* P. _4 E
, w( f' S5 Z7 p. j   <order>
* K1 ]% ?% f% c% p8 E: q' X: H( k! }! o$ S) p
       <customerid limit="1000">12341</customerid>
, p# @5 j/ |' w8 [& e9 @* a# t: z
9 I0 n' J3 h  Y9 R) k& }       <status>pending</status>
; U8 m( x: H( {" I, \1 o" [+ c. b% F" A* Y4 K+ k$ v4 l
       <item instock="Y" itemid="SA15">" ?1 H1 x$ K/ z- B% r; q- J

- x, [0 O/ @5 l          <name>Silver Show Saddle, 16 inch</name>
/ w  j* [- U7 S4 w8 z+ {
* c7 a8 j: v* y' t( p$ i          <price>825.00</price>
( r! u% a% _0 i; _/ O
/ k. H7 g7 C: u; t          <qty>1</qty>
5 e, d0 `$ c; ?/ c* l: I# f9 Y% X
       </item>4 |+ N' ?* ~: w7 D
" l: ^4 E- N1 y; P4 h$ t, W
       <item instock="N" itemid="C49">* E9 u9 ?8 E7 L7 i% [: L/ T

8 L0 i! e, {) m/ Z8 ]6 h3 t2 u+ }         <name>;Premium Cinch</name>5 c& U3 F. K4 O, j

: C: X) L# K. ]/ b) n$ K         <price>49.00</price>0 f  Y" V3 |+ P) V  [! B$ @% s* m
0 Q% |- ^  `) A
         <qty>1</qty>* [+ g6 z. G' a5 w# J9 b
; A2 S6 ^; ^# f; Z9 ]- X7 p
       </item>; p4 t% O4 z5 `3 ?6 W1 T

, s" D4 s+ z8 m+ O& k& J  </order>
  j% M( y  W, f# ]2 _& O3 ^3 j: a6 E' k" N8 m2 w
<order>
6 O$ a( r& x$ j9 R+ I9 r% b( A: w) V' A$ U6 B/ ^* @2 l( G4 d
   <customerid limit="150">251222</customerid>
8 g; d# j7 m6 s6 W% L5 Z, ^: W( {) J1 h2 ]/ }0 t
   <status>pending</status>
0 q. c9 j! n) j) ~, k# A. E% ~6 U$ u7 `: F  s1 F/ @5 d
   <item instock="Y" itemid="WB78">
8 @. L* }# t+ b' @3 \# F; M" t1 l# }) j8 W  r7 r
     <name>Winter Blanket (78 inch)</name>" ^2 l% E( ~3 F$ R9 F1 y$ x- t
( W' ?* Q8 }" Q! h( O
     <price>20</price>
8 ~8 a8 H" r) Q, T; b- A4 V" q& M0 g5 u* y+ @8 p" p4 ?
     <qty>10</qty>8 T- x! E! ^) `6 N; w; [. ?1 I
0 z$ m# Y7 e$ |& b1 G7 [
   </item>' f- o$ A% y. q3 e- P8 `
6 L7 B5 C: m1 x8 ?- K3 C# j; G
</order>
! ]0 B/ U' _) n  G$ p# I
: M6 ?( e6 _! |% l</orders>! _" [' h3 S' e# Z8 _) I  \. d& c
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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