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

DOM的一些概念

6 O) X2 }3 [# w7 |
开放分类: 互连网、网页制作、web技术
7 y' a8 J' n, B" e' W! V5 U( RDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。" J* k3 {" ?6 d

7 |& r# H  q  p- iDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
0 I2 {6 G3 J2 l+ S( Z7 i( n( \: K$ H) S' b4 t3 C
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
: n! `0 L9 E+ a; fSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。; ~  X' }" h7 j" w" F
! I. ?+ g0 K4 {. @: X0 \
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
! g5 T- G) P% u# y, m  F& g
, A$ T2 m; j  U% M4 D解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
* Y) a! j. z$ E( w( G# b2 f" Z
. Q5 J# N" u- H# g作为 API 的 DOM( u- ]# u9 o! J6 d2 ^

; D# y0 k0 g' Z' \- q从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。& g8 y) I  s+ X8 w
. ^1 y, V. f$ T6 J3 ]/ E: S  [3 B
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
7 I: A1 \* T5 \) N
. ]9 s6 c  d2 r# c. CDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。; J9 T9 u0 m7 g2 s, m- g
8 b. E8 @2 d2 Z9 H8 Z) c  N
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。( k5 D2 A. o" O( w% g! L/ A

. m: Y) l4 ~5 L4 y" [DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
  E( o+ P9 l+ J" I# z4 Z" m2 U3 F3 q$ O7 a$ ~
确定特性可用性) i5 X, o7 M/ L  |- i  I
) b; N% @3 s! t7 R! q$ `0 F( q
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
$ p1 z1 ^- a0 E/ C8 z# r& Z1 E- g
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
% x8 t6 p2 K+ l
, |8 z: \- V6 E7 ^6 o. ~' N( B0 iimport javax.xml.parsers.DocumentBuilderFactory;, i% T  y$ k* |  Q4 c, I
) n4 v3 {! y$ U9 q+ `  P
import javax.xml.parsers.DocumentBuilder;
  z, F+ s- _- ~- c) Q0 q0 V$ O; w: s. x
import org.w3c.dom.DOMImplementation;/ g: q" x6 S: _7 Y
4 l: l" [1 {. z# c8 o* ]+ [/ Q
public class ShowDomImpl {; ~" w4 e0 L8 Q3 O: ]

' P+ B4 ~6 {! z$ o/ l2 apublic static void main (String args[]) {0 ?: B2 m* J4 [7 X1 X( b1 \5 n6 m" Y) T

, a  f- @6 _: v  ]& Utry {, }  [3 G' B& F$ `$ P! [6 l$ f' w

7 @2 F" n- i0 h, `DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();) A! M9 }. j  _+ X" R$ @4 j" G" W4 g
% Z6 |! V0 E6 J, z
DocumentBuilder docb = dbf.newDocumentBuilder();' a% r/ C* r, A) X* ~2 n' ?
  \2 ?! `8 K7 Y' T( u. e
DOMImplementation domImpl = docb.getDOMImplementation();
6 P* i& @9 p( m+ f8 |5 z& R" a$ i0 T  Q6 v5 `
if (domImpl.hasFeature("StyleSheets", "2.0")) {1 G) L1 |- g6 F, Q! Y2 c
+ Z5 L$ o" V9 k9 E: @6 X
System.out.println("Style Sheets are supported.");
3 i6 l6 t0 V- a3 v! u9 b
, W4 w% k2 X- {} else {  j# T% D+ m5 ^2 B+ Z

, S, W- \  p7 G, J. i2 c/ u3 ~System.out.println("Style Sheets are not supported.");$ W: B& K- q7 f! y: ^) `. V  J
/ x- V8 @* C! j+ H  Q# O3 ?
}
8 w$ o8 ?9 l. r/ M4 E* T; A( H8 r  f2 p: ~9 [& p! v. |" w3 c' R
} catch (Exception e) {}
9 d* y+ }& W7 K% k) z0 h) U) `" b- r5 c0 K* c
}
  g1 O! K2 r3 s- L# \. s. B, i
1 D/ o9 Z1 M9 p: t}- ~8 ?9 T  _8 b
1 t4 N+ `. h: A  s' V% f
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
, u1 G2 z7 I& M7 O% z: z* R! X
5 `7 _& P+ w' z% \6 [) I' `, m本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
  \; I6 i5 U' q) e/ o1 b; z5 t! w/ c0 r
基本的 XML 文件
3 E: ]/ L/ ^) T+ {8 B: ]1 l! h5 A  c  k
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
( T/ R' H& k. Q& u( P% h! s& D0 U: f8 {1 E8 ^) v/ E3 \( H! \
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。9 c  x% C' i1 K! h
8 d. a* T# Y* t
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
  _$ s% x' U7 `5 f' {9 m4 B6 X7 i8 x# {4 ]1 \
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
' N0 V  e, S  a& `) g; L) C5 Y$ r# c# b
<?xml version="1.0" encoding="UTF-8"?>
2 X# ~4 Q9 L5 X3 O, e8 R% a2 x1 L5 E# J* c+ [( I: R
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
& ?4 X6 p; f( I8 X8 o' @' g6 V. u7 K0 J
<orders>3 U+ c" H, h) f" \$ i. }3 L. h

, m$ ?( u; Y8 l1 f- b7 }   <order>
( t0 `, B: T) I( g) T( G- m2 ^/ S/ a. V& i% m; j
       <customerid limit="1000">12341</customerid>0 Q+ F  y. Y) i4 v' f8 {
$ Z6 D( |! r$ E- u
       <status>pending</status>
; ~6 [  ]( O& U, T6 G1 Y6 d' ~% t# v! \( p$ Q; v
       <item instock="Y" itemid="SA15">
% u8 q; H4 o5 \' @6 _
, R/ u1 p! U. T. E, L          <name>Silver Show Saddle, 16 inch</name>
( b1 H% c- d, \6 Z. `1 w- F& L/ q3 m2 h, p0 v" z
          <price>825.00</price>
! A2 t+ D+ f6 J/ O/ R! B
/ t$ z- T9 H2 z& e+ S          <qty>1</qty>
$ ^0 C! m7 F6 c9 D( @0 l+ ]9 j& L% V7 s. b) @5 F/ c
       </item>2 d' U/ o3 C1 `, D
+ ^! P# h+ Q. y  L; h% V% E5 [
       <item instock="N" itemid="C49">8 d  ~. c0 ?9 E9 T( v5 P4 e' M  t

/ ?: a9 F6 c! o  q' a/ P- P         <name>;Premium Cinch</name>
( {) h" T) K7 x, q) V5 a- S" e
9 ]8 K' {3 o, L         <price>49.00</price>
* \( T' R. U0 z! m' z2 k# i/ `" v: h
         <qty>1</qty>
* L/ p" Y' [5 [2 R; x. V2 H
$ Y$ A* J# v# \) {4 p' b) O' Z' v       </item>
& `- H/ w8 c, F: P- ]' _* |/ m! a+ H( R; C$ {3 K
  </order>
+ d& ]% }, A# }: w% q/ l$ Q3 m) e, d" U6 j2 b4 d/ P
<order>' Z* l8 B: Y) s) b4 p
, O* s  Q' U! s& R
   <customerid limit="150">251222</customerid>2 I1 R0 J+ o, e% Y  r  T+ F

! m9 E" }, _. [: S7 t   <status>pending</status>( b) ?: b: z2 Z

: w( Z4 S: z/ [; R; Q4 ~1 B7 q   <item instock="Y" itemid="WB78">
2 a2 y; S5 q* ~% m. ?/ g4 Z7 [- O/ y3 x$ u
     <name>Winter Blanket (78 inch)</name>! `0 x' a3 @4 i# J0 @
- o; x( ~+ a) V4 v2 Z* ^/ o- Y
     <price>20</price>
* V# q7 R  I4 d5 Z7 k
/ ?$ w2 z4 m( @) ^) y- L: i2 {     <qty>10</qty>  Y: D7 n+ b6 V. E% @' s* d

8 Y! v5 `5 S! N8 g. B; s8 g9 @   </item>
) o" w+ ?1 i) V9 j0 d3 `* W5 Y( A/ F4 g
1 C. m/ b8 U" T1 y</order>3 L8 p' C$ J/ ^% s7 t. G
& P2 t- F. @# V3 p
</orders>( t' |, n- Y9 o
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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