返回列表 发帖

DOM的一些概念


1 a% L0 ]) s: n3 F; g( |( A开放分类: 互连网、网页制作、web技术
: u5 Y9 V7 B4 P  eDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
/ J0 v2 G* e1 ?- S& l* u! L# a' J% d% R: Q2 N
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
% m) ?7 e  P* p; Z/ t, f: G: I* S1 U# E
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。, ?8 R. f( h1 v6 v
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。8 c8 [  E$ X1 g. k: V- Q
* @* ?3 l, D+ f' O
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
6 h% j0 z$ M; j/ O% I: C9 E, v5 C8 H2 s: v5 i5 c  i
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
; v0 e  F" J, C, V8 j/ S; x( e; i* P7 h
作为 API 的 DOM
/ j7 S) P# T/ L7 O5 {4 Q) }; k
* `, t* ~0 `$ a+ w5 Y- U# i% @从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
8 w, {: J1 l1 |" k/ w% Y- d! Z' L3 h% i" T2 d
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。2 b( ~3 j: r! b) Z5 W+ A

& B5 s# n5 Z+ GDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
. ^! E& I0 C. T' i2 J
! h: v9 R/ Q3 a+ B, Q$ U当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。" m3 U! }7 c" I
! {1 u* t, k! n& @* l+ F
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
7 a# a6 v8 \8 Z0 A/ ~2 Y, I: q
8 J% w. ^9 A- f$ S/ Z确定特性可用性
% p; @* Z: Q+ T1 p
) g+ U4 G% G8 f& W+ SDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。" H8 m# L( m" s. b

, L6 @6 @' ?* }0 N# ODOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
  K3 a) \  m: ~2 G! o
0 b) l( g# L- X! [1 a; g3 oimport javax.xml.parsers.DocumentBuilderFactory;: n5 ~& g9 X' m# \; z+ u

1 ~  A5 k4 p1 Simport javax.xml.parsers.DocumentBuilder;
4 q5 J0 }$ W  I/ C: w# F/ v
; n) L! Y8 a' s. `( F2 Mimport org.w3c.dom.DOMImplementation;, p3 k5 ]+ [4 E3 u3 \) u

: W, }9 ^; F5 Rpublic class ShowDomImpl {! C; w* \& C7 B. q9 k
# I: z+ _+ h2 j! Y6 |
public static void main (String args[]) {
- }* p5 O  {- I! A* q4 Z) j( d4 K) H* t
try {2 H/ a5 R5 V  P  x; r! j+ r) K  V9 v
' g, j! n% s1 p0 b- E
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();& J5 |" @0 s& c

( `# ^: R3 T+ p8 g- d# b0 QDocumentBuilder docb = dbf.newDocumentBuilder();6 B/ J3 h7 l- E" P7 a' t5 V* x" N

" [0 Q+ Y& j- s0 [DOMImplementation domImpl = docb.getDOMImplementation();+ ]( p. f, s4 z8 L7 h# D( r5 P% g

( V2 L! H; L! m" R9 N- m- a3 ^if (domImpl.hasFeature("StyleSheets", "2.0")) {
( Y3 `/ g4 K, I% L' ~7 V3 e, a4 [6 u6 W8 M7 F
System.out.println("Style Sheets are supported.");" V& C. m/ z0 f/ ~+ B" v

$ D( c$ x; _2 {- S& D- [} else {4 o" }2 f& T% k7 S9 K% C
% P, U2 ?% y" E- R7 }. Q9 _
System.out.println("Style Sheets are not supported.");" o) u) n; A/ [' {8 u% N
$ L" P' Z3 _" u/ u
}) E- N0 S+ d0 F* _9 D& i5 Z

/ U4 g: H3 A% \3 @5 X; x. i} catch (Exception e) {}
5 L$ {9 |; P0 z( {$ G4 `; z% M- `
' V# `- l4 l6 q( C/ X1 G7 q6 U}4 v7 b9 f7 b' O# d

1 c6 x! d( S$ @1 q+ a5 ^0 j}& @* @& `' Z3 ?, Q
' c" J$ B' a* G2 ~
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
" i& I! o, l4 g4 l! `% E
+ J4 o. A( ^4 D本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。, X" F' l: ?( S, P# F; m" ]1 N' ?

& `; A  M+ _$ O- F/ q; U基本的 XML 文件
* X4 T$ K% d! F; ^* `6 o
" q1 a/ ^" [! U7 m. U5 E本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:9 D5 H* A3 V1 c7 n- i5 e

, H# [& E- x* p4 i5 N0 vXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。$ z8 |9 `* y' K. a

5 S5 w3 J5 ?1 S' P9 Y% A/ qDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
7 o- N9 e1 u0 F
, r8 c6 u5 r# E4 g* J2 \数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。6 Q+ V( j9 ]  o/ n2 x) e
) S/ B' l* d& ~
<?xml version="1.0" encoding="UTF-8"?>
! W% w- N3 `- L6 ?$ p
; F6 ~- S, n0 _5 W4 @, S( l3 }* s<!DOCTYPE ORDERS SYSTEM "orders.dtd">
- V6 G4 o7 S) p6 v( o4 l( p* H3 P$ u4 h3 f3 L. l4 Z" i
<orders>$ X0 @% [# u: ?# V& C# n( _& f( {
7 D0 z* B1 N5 W. Z) N
   <order>
: j9 s& b) U4 u, G" q
+ H) V# H' }9 [5 F5 q, e       <customerid limit="1000">12341</customerid>
: C5 j# E; o' F
# q6 x% R  X8 v( N, I3 u. _3 U       <status>pending</status>
# d3 L2 w: q5 u$ I
$ S4 o  H6 d' X7 A# s       <item instock="Y" itemid="SA15">- Y0 W4 h% N) r2 n
! S  A' ]0 z) }6 x
          <name>Silver Show Saddle, 16 inch</name>
; x# @& {  N. V& h, i/ v* K/ T( j9 `, Q$ r& ]
          <price>825.00</price>
0 r6 N! X3 s5 S  l, ~/ w3 l) w. a5 Y1 w+ J
          <qty>1</qty>
, A7 K' x8 z9 b/ M
) X* N$ C( R# U% ~       </item>( ~. f8 Z  c6 [0 L
! @% g6 }8 U: {7 x) P/ H
       <item instock="N" itemid="C49">
  W8 Z& E8 [/ a) ^& o6 s" }( Q3 R  I2 B. ~4 l- g
         <name>;Premium Cinch</name>
4 h' B+ v( M/ f# @& r% K) _, y# f5 C- ~) c/ T
         <price>49.00</price>: D' D8 ?, e$ j8 z5 I  v7 [

; o% m3 n' n1 u3 S9 w* k         <qty>1</qty>5 T9 O, y+ `* \

5 R7 ?( [% i8 q! r( S       </item>
: `, U- Z* h; t- p1 ~: g/ ~; I6 o- m  ^
  </order>; B4 j! o9 N1 M$ X* [8 P. H

1 P. |' c* D) _$ L5 v<order>
; n6 T+ v* ~: I: H1 F1 p) h8 l. G* D- S+ M
   <customerid limit="150">251222</customerid>' y, P0 p  n& [  ~! R2 d' U5 M  V
: C* @4 s* ~" ?5 b
   <status>pending</status>  Y' C0 S1 I+ S

5 t; H1 f0 s9 M) J8 [. U   <item instock="Y" itemid="WB78">6 {5 b, k& T2 s: Z
1 L% f# k5 {& t4 C
     <name>Winter Blanket (78 inch)</name>
; J& f  D7 D1 h3 g( L( o  ~$ |4 i% |  m
     <price>20</price>' u+ f1 C5 q# n2 b+ _! O* [
6 o9 N# |( k6 }' |
     <qty>10</qty>+ d- L+ f" d1 t0 x$ K) q  s

) d' |0 ]/ e& r! y4 |( o$ r& O   </item>
- \/ _) \% Y* ^# Y# @4 E5 y  F+ P. R# g
</order>
: L5 k! o! p  _, v& l
- X; h0 V0 z. ]9 m+ W$ l</orders>
- P% q" c, g; I* W/ I在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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