返回列表 发帖

DOM的一些概念


  K; \/ A( M1 S开放分类: 互连网、网页制作、web技术
, i  d) r5 `6 a) hDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。$ b* R" e5 J0 `, [& l  Z
% W9 r0 b$ ~$ y! Q. ?
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
% \  l  \+ u5 m9 _5 T% m/ d/ F1 v' h9 q
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
+ f! _9 B) X/ c& ISAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。" \' G: I" S$ E: E

6 f8 `  k9 u: U2 r7 P另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段! V* A3 H4 a5 O7 {9 W

' _4 ~2 Z# `5 G解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。3 A3 M0 n9 A% K& m8 _+ w% ^
8 r, b' u4 ?, J0 d
作为 API 的 DOM" ]3 |" ?; y: n

0 [. y! R6 n* m. D& L从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
; b. v2 S  t+ F5 g7 W, r
8 H3 [1 B  b* `% r# H) p% ~+ u6 [Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
* X4 o5 G% \0 p, z7 D- R. [0 w; P, O0 z1 W8 p7 b
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
" T% D. [0 d$ }# u
- p1 a, R- x% H* q; A- u当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
0 r- G# t5 P$ t7 l- S- o
: u$ ]5 F  H6 W$ T6 dDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。9 T& G8 a$ K8 Y' r
+ Q$ ^9 g( M2 O1 d8 w
确定特性可用性, J, P; W& `" t6 l- i% Q. J

0 P! J/ \" I9 M, w" @7 G, NDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。* E5 G! E- @7 B0 U% T  d0 `5 {6 X
- y6 m- [' b) V3 W
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
7 R+ u, ?. G* l! h# R
8 W& Z9 z: \2 X/ r) Fimport javax.xml.parsers.DocumentBuilderFactory;
/ I0 a) |& c7 Z5 w; P. V7 C$ k0 X$ _. P2 O+ k$ H
import javax.xml.parsers.DocumentBuilder;( ^! q6 ^" I* ]" @, i

9 h0 ^$ w1 s' s7 S& `/ bimport org.w3c.dom.DOMImplementation;
# d+ H7 g8 a! |2 F! t8 m
& i0 {: _( n7 S; }- p# Rpublic class ShowDomImpl {) Q2 @4 w3 n9 J! n. H9 D

( y7 x; [  ^/ p, J+ Dpublic static void main (String args[]) {
  X0 A4 [& g, @- Y
9 K  o. q5 Q! h1 @, i+ y' wtry {
8 c$ @% Y! v( j7 Y5 E: m6 c$ D1 D7 m: v# d3 L2 V( X! E; f
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
8 }* c* O5 N) H* }3 T% c+ a) \" E
DocumentBuilder docb = dbf.newDocumentBuilder();7 Z* F9 q) o3 j; c3 ^

5 Z9 `/ |7 S4 h  ]3 g3 W! LDOMImplementation domImpl = docb.getDOMImplementation();
5 j: Z7 E1 N3 h) W0 @5 F
  E! ^) O/ s- v+ sif (domImpl.hasFeature("StyleSheets", "2.0")) {
( ~; M" h! Q) o: u
/ b/ S! I# S+ Y8 F: L# HSystem.out.println("Style Sheets are supported.");9 y; N; l4 @5 C- P

3 y/ r+ {% m1 f} else {  O2 E7 o/ S: @: K! I  B  Y: i
/ S/ t  w5 e8 H9 z  t; }( H
System.out.println("Style Sheets are not supported.");8 N8 D6 C4 ]/ a, n8 d; v+ }8 Z

. P1 U. q  A$ z9 g7 [2 ?}
8 w; \5 T2 r7 C/ e. a
$ g: U* s8 n( K/ h} catch (Exception e) {}
! `! ]- W) h" i& V/ n5 \4 F' ~2 X% C1 e- E* l0 s+ P5 G" S
}
- b1 m4 f" ?6 {. c
# J9 y, w, I  ~+ j}8 ~& d" {; l9 p- h/ A8 y

) U1 D0 a2 o  {& k+ C(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
+ W1 \; w) `$ Q, A: H0 X* p" e
7 O; F- H- {7 ?4 K# k本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
" _8 h  R! k1 `; v1 |* U0 c0 y0 ^( k
基本的 XML 文件
- i" @% O3 a; V) Z- p- X7 R1 j
8 K1 P- m* {- Y. A( b9 I  v本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
" H! m+ s# m/ u: _" L  X
* y+ U* k9 R& I% A* ]8 |& ^  qXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。9 a" O7 m; K, Y7 F" |7 j

3 e- P7 ~6 L7 f) EDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
' V% q& l# m5 r' s( S9 G/ ?/ I7 R% y
/ M: O4 j' {( E5 p+ W5 w数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
: V7 C6 }8 u# C0 s
6 M5 G- c: i- N- M3 I7 m  X7 M<?xml version="1.0" encoding="UTF-8"?>7 k" C! S- L8 {) y, Q, A

+ o& S* X6 H. ]* A! O& D+ S<!DOCTYPE ORDERS SYSTEM "orders.dtd">
) J8 y. R2 t( p, B( M& ^! `. l& s9 j9 t
<orders>
* y$ [6 [; a: X/ o( ~. m" j1 G1 H! C3 ^) t) \, E4 o0 `0 w7 O1 Q
   <order>
  q4 u) H9 I" v% Q1 i: X9 @: @
* k9 f. B7 s% M7 s# W- A8 R" m% ?       <customerid limit="1000">12341</customerid>% }1 `9 g/ n% {0 u

2 S- p( B3 w8 C! U  `1 H       <status>pending</status>
' o8 \4 j1 s9 @6 |1 K- O. w( o8 L5 w7 a
       <item instock="Y" itemid="SA15">. f$ b. K* H' Q0 [

6 W; {$ u) n# i! f4 s2 |, w          <name>Silver Show Saddle, 16 inch</name>. R% l! J1 E2 P, _* b0 L5 j1 Y" {
* M3 v7 y1 c1 z7 X+ Q
          <price>825.00</price>
" a+ j! S0 B$ i: x+ p0 J3 w
- s7 o0 {3 V/ _0 \7 \' ]          <qty>1</qty>
8 }; {0 v3 q* M9 S8 Y0 `2 W
1 F/ ~4 B5 o' P       </item>
  j( S  A6 E4 W6 x3 ~0 c9 _& a' k* G
       <item instock="N" itemid="C49">/ z. @' {# D) b

( m( w3 r$ w1 X         <name>;Premium Cinch</name>- |" j" f8 _8 L' r8 t: K  m

% |8 L" a& Z0 w# B( a; P0 O7 X! ^         <price>49.00</price>- v: @1 i- A+ `4 S" I! Q

/ w- u6 `" N) v, H# u7 r1 I9 N         <qty>1</qty>, a& C# N8 \+ G4 I  |
$ A3 `/ X9 J. j5 L6 d
       </item>+ R6 _. w4 l6 O+ ]/ Y5 d
& l- l3 D% f0 t$ ~
  </order>
' b2 V+ z5 {* C& {# k( y: l2 R  D/ v5 L" H! m" w
<order>
: r2 J, q5 c! J  R
0 x% {" u: ~% }  T' n/ J  B   <customerid limit="150">251222</customerid>+ w: ?4 J" S4 R6 }. K
) c0 v2 i# ~) E! Y) x
   <status>pending</status>
8 B  P0 V3 f, \" U2 ~' \6 C1 G8 R
" d0 |- \8 Z& U, S   <item instock="Y" itemid="WB78">; B/ V  n1 j$ O3 @
0 C. \6 ~" f: d& k7 l( a9 p
     <name>Winter Blanket (78 inch)</name>
& c" k( _5 H' C% Q% J% g( o; U/ a+ E0 o+ K3 M' H
     <price>20</price>
, R1 R/ b, b1 h, D4 ~/ C
0 G& H' X: d7 W& {     <qty>10</qty>
+ X, `+ \1 P8 f( [
% N- g3 F  a/ U7 F   </item>+ j: I. h) R( d/ g/ U% R

3 C' {: a0 g+ O</order>
' @3 L+ E1 E' @$ w& L3 R
6 {1 t# u* B+ I" o</orders>
  g3 L* N$ h" E( p" Q7 q5 u/ q$ Q在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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