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

DOM的一些概念

; \! L# ]) N  s/ p2 j, C
开放分类: 互连网、网页制作、web技术
! O) j; y. D' h+ Q4 vDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。1 T3 Z7 T' C3 N* Y) s) J, ?

; C3 E4 y3 n. s# k% w9 uDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
) ^/ s' k' d, u- F4 I% _% V% I; F: _; V3 G: @  t+ v  p
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。! h: P7 t/ U; T2 E: i; q3 U
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
+ x$ r9 o$ {, H: w1 J5 v
( b, D( J* M# p5 q2 j另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段: L3 e2 v, b1 c/ r

/ h* [+ z0 x0 u  ]5 ]2 L解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。1 J5 L: I) H* [9 U" l
" A; k: v/ Q% \8 t0 ?" {
作为 API 的 DOM
$ p7 i3 g2 t* K1 s7 t+ e' f0 Y4 c1 d; [
! J# T  m/ s* B/ F9 u+ b从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。5 L5 Z; Z% C5 |6 B4 ?3 {/ W5 ]. P4 B. m

) |/ G/ H: E1 d+ DLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
% q3 U1 |# Q4 N
" K* O! ^7 {2 t- gDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。1 B5 U, ^' d% Q5 i/ B  r
! ~) D' R9 s3 o: w' j. Y
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。' d; p9 Q: m8 L; b$ C2 y
! [) [  U. ^) E3 F" x
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。- T# S/ _+ ?5 j2 X
( b; R! u; P) D
确定特性可用性; r- L, c7 \; C/ v

8 V& a. R8 C& }DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
% D6 Y3 Y/ o+ l- k/ k# G3 u- N5 x9 I2 _; m# u' C* m
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。8 @! }" N& G1 E4 q5 }3 p
2 y7 l) t  w5 k4 a
import javax.xml.parsers.DocumentBuilderFactory;; L2 ^# h( F3 q

, }* l# J5 `. I& ]: O4 `import javax.xml.parsers.DocumentBuilder;- h: G! c; W: |+ u9 H
0 Y- U  E: P# H7 S$ \
import org.w3c.dom.DOMImplementation;
; v/ p- L- H6 s+ ?
& L  Z0 q( K5 S7 h% Z# x. ~% ^1 |+ Mpublic class ShowDomImpl {; R0 J% F- `% C1 s. C' ~5 Q( |

9 Q, g" q; y' hpublic static void main (String args[]) {/ x+ p4 M+ ?# I/ |, S

3 a) L2 P' e# L, ctry {
3 Z$ q" K9 r5 E8 p: a1 \# l
, x  g. s8 D/ b5 zDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();8 g( d! }8 T2 W
0 [. O) ?( U* f' s  f# o
DocumentBuilder docb = dbf.newDocumentBuilder();+ w$ |* I, W/ ?! F2 O# o

8 ?. A" |1 K; C+ sDOMImplementation domImpl = docb.getDOMImplementation();, M" Z" W& n0 D  T; n$ M5 W

: A! H. u% q9 ~6 k: T; e7 w3 t. sif (domImpl.hasFeature("StyleSheets", "2.0")) {
9 z  K7 X8 h+ V$ z) h6 I  a: ]' x+ v3 v+ T; t- ?
System.out.println("Style Sheets are supported.");
7 h9 b+ G  r8 l. M
4 a+ V% T2 V5 @3 W, |. m* Y/ x& I* u} else {
( x: D% d! L, z" @7 g4 o  B
; U+ T# ?/ g; FSystem.out.println("Style Sheets are not supported.");2 [, c" e1 ?. ?" S; Q2 P! A
5 M. T+ B; D) {' u( r: a& ~
}7 b+ o, e/ Q3 }# j: _5 V7 A' v' z

1 ^4 K* @; K  Z} catch (Exception e) {}  c+ P$ T# B: I
8 @: ^: L* N3 S, s" G
}3 p& Y) G+ f8 h( \5 H
, C6 m& H: Z, H
}5 L* v  b2 B) N8 m, q

! ]6 G6 X9 q" H7 b6 R. S8 u$ h0 r(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
& ^3 S+ s9 c( g& {
: A% X( a' Y  X; E$ K& d# J/ p4 {本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
7 x$ `. g2 @# U2 Z" E( k/ V+ l0 O' j$ }/ k( p% Q! m
基本的 XML 文件
( L, M  |* p% V. N) t5 B  ]+ Q( K& f# Y& K" s! g, n
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:4 W( {2 W. }5 \* w2 p% m0 L0 {/ E1 s

; I2 H* r' J) H, T1 b  kXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
$ j- L$ n" |1 j% D* P' L! v
+ E3 t. W7 Q+ v* TDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。% u2 v7 V) v' l' [7 @# V

0 O5 s+ X9 M7 C. S& x3 g数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
' o- [$ ^0 N' m: S/ ~0 O6 ~) ?0 {: G4 `$ a
<?xml version="1.0" encoding="UTF-8"?>
6 R1 \! E# l0 @  j, b, o' q: o
3 I& m' O2 r# h# K& T2 h1 b<!DOCTYPE ORDERS SYSTEM "orders.dtd">! U& B+ E3 K9 S" D8 n

" M% g: i, \' d5 {( A, f<orders>5 M8 x( I  O* A. v% j2 }
" m% L3 Q* R0 V! ^3 K
   <order>
! v' |( l! U- C# b
  F0 _6 g: H: J% G  ~6 d) i       <customerid limit="1000">12341</customerid>* u- c4 g* K' i% {. J( f" U  F
6 M! y: i6 p: k+ @5 i# Q
       <status>pending</status>
/ m. m0 R# D- N& N6 p9 H5 h/ w% _4 i8 V* e
       <item instock="Y" itemid="SA15">
4 h7 L# L# o3 w6 F- u0 g, f9 r8 J* b. L- @
          <name>Silver Show Saddle, 16 inch</name>+ |( r. B2 y+ T9 S) `) V: d
. N; V( [7 J6 F  e' ]+ [$ t
          <price>825.00</price>
: {9 Y7 ^( P5 e  S* `* L0 t7 p/ n3 [8 ^
          <qty>1</qty>, U8 A, C2 S; R

1 W3 P7 E1 l0 Y* \       </item>5 R& X; {" k' n: d* e

5 F  D: J9 z" }       <item instock="N" itemid="C49">
  k* U0 X$ l5 T( l$ a% @0 `
8 u. y: Q* Y- {+ j         <name>;Premium Cinch</name>
; G- L3 U. C) c0 p/ b4 M0 ^1 Q$ i+ w# i5 x" F% }; `6 P
         <price>49.00</price>$ E, q* V6 g0 p0 e- K

- {2 t" s1 F# m  p         <qty>1</qty>
' _8 ?4 f. H2 E9 q, s* [( w$ I! q* P0 I" D* c
       </item>" z; s; p2 [- \) H& a

* D& ]- b2 V+ z7 m0 ^. |, H, k0 I# k5 W  </order>
, C) {! j9 g( b# i4 ~) C
0 K# V& g( s' a" b6 K<order>
. m3 q  g4 E( X  w: Q( t# l  N6 O) E
   <customerid limit="150">251222</customerid>
! a- x. a8 Z9 _/ y% H- @, H
9 k- }- Q' A1 P- i* Z% e   <status>pending</status>
6 h- J. D2 Q' c# V: T2 t" p# H% j
   <item instock="Y" itemid="WB78">, V$ y0 S7 C+ w) Q3 o; G

. v$ K+ Z" ~9 h/ p3 {& l     <name>Winter Blanket (78 inch)</name>3 a7 j. i- K, k- M( M+ a
, T, {* ^4 |1 Z8 ~5 G' H7 i0 A4 {$ D
     <price>20</price>
: m$ V$ \$ r/ n: ?& r) a- I% G5 a* k! m, Y1 n, \
     <qty>10</qty>
3 ~0 m/ x$ T9 i) O- w
5 B/ B* S% n7 N4 G: ?7 d/ @! U   </item>$ c' S3 h, M1 N0 E9 i, m8 U
6 j* l2 F2 S5 o) e4 u
</order>
7 p) s- m# Z8 v# V
- i' M) U0 C# _: K4 f; M5 _</orders>9 Z. _+ F: G/ f! ]' r7 v
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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