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

DOM的一些概念


0 q+ K; }9 i" o$ B1 l8 [% V% v  |' b开放分类: 互连网、网页制作、web技术" A  `$ R# t5 L( p
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
( c; ~: j& O! r$ L3 M% f/ v; P; F$ X3 p" [
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
3 ^5 U* ]: s" @1 P; U$ D: a; ]7 H# L/ f+ r0 d0 Y6 z/ n5 ]* f
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。( T8 S9 G2 f( s/ l' \
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
9 u7 K5 k" ^8 k9 [; v1 k9 {( n& Q% w# d: \; E1 Y9 |8 z
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
0 ?3 H2 B7 H$ g2 p  }: _, ?* k% g; [( C" }' |  X
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
( i$ i4 a# Q0 N; F! R
1 s0 v+ n  v$ ~' X作为 API 的 DOM
0 x5 p; G  c) C* @" ^6 f
$ Z4 n; j3 C; r- @/ j  u从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
2 A: z: F  G7 C. I2 |+ L, W: \5 l% M6 G) G& a
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
* s) b0 I* s; \: W7 p( w8 @( Q- X$ R( n0 M
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
% j' A/ q) M# L/ R- y+ R4 M
; d. s2 r2 q6 h* M' ~7 ?当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。8 c) ^: Q6 P. l7 f+ D

) G. A- v; Z7 h* p$ L4 h" [DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
5 o: B: A* n) y; g3 y5 Z7 @* Q6 K
1 g4 I1 D. z* J. t. ^确定特性可用性7 M: D& H1 t/ O5 E, @  N, K

8 A+ ?& V: p2 G$ hDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。) O1 m( |# L3 {; R1 L, w" @" r
2 `& ~4 D5 J1 M0 x! b
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。/ ^# |6 n! O% t5 R5 D# U: ^

' ^- w( E5 Q( S$ d8 r* ^import javax.xml.parsers.DocumentBuilderFactory;
* g- h& H/ O! a7 O: C' Z9 O* d2 O
import javax.xml.parsers.DocumentBuilder;
( \; ]3 ?$ p$ C4 Q. N
& e- L2 b5 n  a8 ]" Dimport org.w3c.dom.DOMImplementation;' Z1 H) y3 }1 G$ F0 o
7 l6 i2 t4 e  g' Q
public class ShowDomImpl {+ Z& T( k1 b, Z$ l8 v$ K

' v1 K. R" q4 Xpublic static void main (String args[]) {& b2 a: O( I: J& z% G

% x, W0 I& Q. ptry {
* O/ _1 E" H& S; c, w
# k: o' J5 S6 |DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();6 ?( L4 n: g  ?# A8 A  ^- X& o

( W3 {( k5 H, A: K' ?DocumentBuilder docb = dbf.newDocumentBuilder();9 d4 V- q  j3 p; Z

, \" p$ N, y; [9 g1 v# aDOMImplementation domImpl = docb.getDOMImplementation();5 Y& U' B) ~) u* ~/ N' }( R: f

- w% R/ c6 o; [1 u7 ]if (domImpl.hasFeature("StyleSheets", "2.0")) {
, T& K$ Z) ?3 F0 G9 ?( D, ^' ~+ }( M+ J
System.out.println("Style Sheets are supported.");
1 d( X& o/ o5 h2 F" O
$ `! p  I8 G& n9 t: r} else {5 D/ T1 W9 D& u/ ~/ T; D
2 p% W! H: t' h4 M
System.out.println("Style Sheets are not supported.");% h$ h; s9 o8 q1 N; ]/ q

$ A' `0 \+ f* ?% k: l5 E, Z}
% I  O+ e9 d( B  x
' b7 j% G# z4 g7 Z* l# t& w) {} catch (Exception e) {}
( U  D3 V  p, B5 j, Y7 H0 D+ {+ y  _! V$ |; n
}
7 a+ P6 Z+ ~1 H, N1 F- w$ O
6 w' n; X# b! G( y, W  J5 b+ {7 C}. l' |% C3 ~% V! \3 y5 j4 k
! j4 Y1 Y: r% c) f; l9 K$ u& R
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)2 A4 @, U' f: b: f
; }- A$ L5 F3 Z& L
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。+ Y0 h: G9 e& O  q/ L
/ \$ W, y( V+ s' P# z
基本的 XML 文件) D' H, ~$ q/ i$ m
2 _; W: ~0 E" r) Z2 L9 m, h
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:$ l% u  Y3 A1 U- {

, L. J( D/ A% @5 ]- {9 I1 fXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
3 }$ U3 z2 z4 U1 k  t6 |0 C
3 P5 f; k9 U7 i( Y7 BDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
# a* i' P# T. d% _: }
( p6 D) ~) n( X5 \. U数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
7 X, g  v6 g+ T( V+ _& T* X! L5 }- e/ [: j7 P+ U: M# O
<?xml version="1.0" encoding="UTF-8"?>0 ?+ v' h3 N' ^
" h; `" Z, A2 P* b2 A6 t
<!DOCTYPE ORDERS SYSTEM "orders.dtd">8 d4 U; W9 C+ n# K1 N4 o

" R$ v7 |/ k2 ?' y! e7 R6 N, D% O<orders>$ e7 Y  P  c/ t( E

6 ~2 ~, |% z+ M+ X   <order>
( e9 t2 J+ p4 U' L3 r; x& H6 S' |/ x5 z! e: i1 ]2 e: [$ x
       <customerid limit="1000">12341</customerid>% b4 A3 f( L+ A
9 I1 l4 [: ^$ Y4 N5 |! b
       <status>pending</status>8 _  s8 |3 R. Q

/ P+ E( h# h$ D! ?( J       <item instock="Y" itemid="SA15">4 ~# O- R  L6 T; A% Y

: L" u: I  M8 O& J' W- a          <name>Silver Show Saddle, 16 inch</name>* x6 d  j" V0 |% N: h) O. l" {$ ~
! j* H2 q8 M" [& G# `
          <price>825.00</price>
" g: j6 |" Z- Z7 ]; [
5 l- H8 P) D' E, a' ]2 c          <qty>1</qty>
9 D# ]4 k% H4 u. ~& m! f- I
/ n2 h4 J, w' S# J! {- y% x       </item>
# I- f# j0 p$ `- P! Z
4 |$ T4 }7 A( g; X* V3 B# b2 @       <item instock="N" itemid="C49">3 \4 P+ m) W  ^% ]5 T
" H4 k4 M5 W, X+ n
         <name>;Premium Cinch</name>2 X  G# S/ j8 V* Z5 ]! w

4 u! E+ b! P5 ]         <price>49.00</price>
& E: x# r; Z% A9 c
8 n' X: S! ^0 n         <qty>1</qty>0 W1 n& f8 h# _$ q& D/ |/ o
/ E# U8 k- P; c
       </item>& K) Q$ e: u; z& y( L- c
- Y4 i6 X. l4 X) v
  </order>4 q7 D9 ^7 y& y; k" p8 P+ P" U

, L  b" E6 X4 A2 ~<order>
9 V1 C7 `7 h4 m6 ^& B
  G5 _& ?) V' [3 i+ p' H   <customerid limit="150">251222</customerid>, M5 l8 \7 c/ Z- o9 ~0 g9 L

4 q& }- P9 W# q2 S% F   <status>pending</status>
' a: n/ e/ _7 ]  T, {6 L
( b; J$ c/ b& U- ]   <item instock="Y" itemid="WB78">
% z& a" |  B5 N* [0 G, A
+ P4 _; A* L3 R     <name>Winter Blanket (78 inch)</name>
$ V, Q3 X# C# }0 Y- T; l2 E7 T1 L  H7 {4 t( s) Y+ J
     <price>20</price>/ z3 o. P9 H3 B$ s1 P1 J
; H; A% Y+ N" O& T6 h
     <qty>10</qty>: C" x( \2 [6 {2 N5 b/ d' H
% ?: |) [7 o  Q& a) k$ k# N
   </item># X( J1 N/ y& B- _" n$ {! k+ S

' M/ E4 g" t: X$ j+ o# }, q</order>
8 H7 C( Z$ m# {3 ~5 @! {1 b3 F# Q
</orders>4 n+ W' f+ w: T! O/ O4 ?1 y' S
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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