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

DOM的一些概念

2 @" W8 M6 _  F1 A
开放分类: 互连网、网页制作、web技术  s  d% b  R2 u8 ?, S
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
" F5 M" q! [- ~: Z* N. K( \' m3 @3 F$ r+ V! A$ c
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
0 U& O9 U' D/ x5 C- k5 \1 U4 ]6 `3 B; U5 {* d
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。& p3 z! t7 n" u; r; Y' y
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。+ `) y4 Y0 d8 U# m: u) q4 `
" R" q: o+ _, c* c. d# ?6 C
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段3 P" I' \1 z# y6 H% R
( a1 m* R$ Y% M' K) X
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。9 L) V; u( x0 {* O4 s- m/ y

! S; `2 S9 f7 @) N: S$ k: L作为 API 的 DOM
3 n7 j3 ^$ I  g; Z1 G, I1 R
( F) n; v. C+ z) d$ Q$ v0 u! m从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
$ ?/ _+ B: W2 Z! s: |' |: u! p$ r
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
/ r1 h  z. i* J/ }" g. F! b+ e8 L6 E  L2 q7 c! `' ~+ `* o
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。% @7 T3 R' ^5 ]; e8 V

, N( [$ U& P" N/ h当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。# L0 I" x# F% w5 _

" k- m; b5 F# c' b- N! SDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。; u: b; }1 R' H% V& q' i
6 a4 U# r( H- Q, C* x. x: }: M+ r
确定特性可用性5 L. E2 E: z9 F6 [
* N7 G* v+ D' S- a
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
7 Q* x6 G0 T9 I! \8 ~* w
- e2 C/ {4 d/ D" iDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
) o9 X- O/ Q0 W3 Z" p+ K9 b% o% c6 q  c
import javax.xml.parsers.DocumentBuilderFactory;
4 A) m4 @& k6 N. |" E7 n6 H; f* O& N# M' H) Q' X$ Y4 L! l
import javax.xml.parsers.DocumentBuilder;, E0 ~- G6 A3 \8 C/ ?$ a

2 J/ n3 ~/ b0 j  M2 n: nimport org.w3c.dom.DOMImplementation;) M5 l/ a3 T2 C
! t2 p, D7 {* i$ T8 g- X1 b8 B
public class ShowDomImpl {" {5 |, G4 V( L! h. E3 i4 {

, W3 K: K! Q! |+ kpublic static void main (String args[]) {
5 y9 n& p3 I8 \7 s
* q. ?0 ?- n  Dtry {
  @8 D0 i( p$ u; l( e2 R5 m: S4 c6 ]. y
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- I' F, t, q9 x6 t5 Q  Z. J% t& C; |5 W( {
DocumentBuilder docb = dbf.newDocumentBuilder();% G+ ]* R6 S" H* S( {* v- [

- I: Y7 A: `0 Q7 C) B3 h% eDOMImplementation domImpl = docb.getDOMImplementation();' F! ?: }  |% ]

9 p( r  q2 d7 f4 O( ]if (domImpl.hasFeature("StyleSheets", "2.0")) {+ `5 j' s7 m( o2 r% B

$ [  |* B0 o& g( }. [! D0 f4 c! q- gSystem.out.println("Style Sheets are supported.");
/ a+ \* K# [2 M: W( ^& k- R- i7 i8 U) h; u
} else {1 ~' d) o& w' X* H& L

9 f! b( }! Y! z. O6 z- F3 zSystem.out.println("Style Sheets are not supported.");
$ F/ R% p) K4 Z6 g# t( O* g" k& N) K1 q' @
}# K0 Y, l+ k$ N3 }- o. ]% {' s

* E3 I1 L5 S8 ]} catch (Exception e) {}
" s9 C; ~9 T/ ]: L. ^1 o1 Z- y$ {( l. a$ ?' X
}
8 n/ `' G* D9 N! s! s6 c8 {& ?9 c" Q9 X: R3 A3 p
}# h$ D* i! @* `3 |" ?

  K! M5 {$ T6 W(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
+ C! t5 K8 M( ]. ~$ S8 o9 z8 |
' s; X; b" T! U本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
: y/ q7 o# L2 x' l$ c& o- ?2 @  J7 I* b
基本的 XML 文件# I! I1 e9 s) e  L

7 m1 _3 S% `+ D& s! R+ \3 Z0 R本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:7 W% \, H5 g# R# w

4 W2 S1 C1 w' hXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。$ R$ k* N6 g1 R5 G: J1 ?. H! V
/ d% k, W2 B3 Y( X/ J) L4 T: n9 [
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
9 z+ ?" \; ^: ^. d3 g  C& v. g0 X& q$ \1 r( S* Q8 g5 m! }
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
0 _0 F/ Q0 a. j7 [! `
; h: N* Y+ A' ?- G<?xml version="1.0" encoding="UTF-8"?>3 I' p* i2 w+ D5 g+ @+ l
% U# U( h) X/ M6 |8 N- |
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
% v) p6 u: \* z! N; D. K# _1 C' J9 r% q
<orders>1 _' J: V( ^% Y. a& L1 B  p4 y* ~
/ {+ ^# K/ X% d( }- W7 d* c
   <order>
7 S; _" v' s5 j. Q1 K( D: N# A
       <customerid limit="1000">12341</customerid>* m; }5 p& K: R6 z9 p$ E
/ }, q5 ^2 |0 u* \) @* k1 S6 q! _
       <status>pending</status>3 J0 w) A* U/ _' l; v+ F1 K

. Z" ^0 c% {# s# ?( h       <item instock="Y" itemid="SA15">
3 r7 F) {% \/ |$ Q" H: {$ m9 A: }- Y/ g! }0 R+ Y1 [/ _" m
          <name>Silver Show Saddle, 16 inch</name>
2 h2 S% D* V: ^$ A# Z, Q; f
+ j0 m6 E- A* |) W' f% l          <price>825.00</price>4 O4 W! O! e* H: G( i$ u. C
8 y$ \6 j6 y* O. q8 S' Q0 U
          <qty>1</qty>; U4 v" D8 }5 C+ W

' }$ ~6 j$ g& Z; @7 Z       </item>
" {: @- Y& ]$ X' T2 |# k% V) }/ H6 W
       <item instock="N" itemid="C49">
8 ]' O8 k# G7 E6 Y& n; x( W" Q0 A9 ~* T' t8 Q
         <name>;Premium Cinch</name>3 h# O( L: F5 ~1 ?# h$ L  S; m) F
( t  B- h+ r2 \9 f
         <price>49.00</price>
7 f4 T9 T: [8 S3 k9 @' k9 S1 ^
7 [: ?- W# E- h% C  U  o5 d+ ]" R         <qty>1</qty>
6 I: h; M9 C' t6 w: d+ }& `6 Q% q2 a; p
       </item>" C8 g- q7 ~. V" o
5 I+ h1 O6 ~: M; X7 J1 e
  </order>
$ E- I2 j% q# Y" Y' U' D1 w/ o- O. I
<order>
: {. W* ?3 S$ R/ d$ a# T1 y( Y2 o, s+ P6 W+ @! X4 h
   <customerid limit="150">251222</customerid>
' `0 n- t; d' P6 v6 H
) X! z) k0 \3 ]0 y( X   <status>pending</status>
' c0 V& g( ~7 z4 M- S* A5 s$ r* E2 Z, g9 @& R# E
   <item instock="Y" itemid="WB78">7 o# V  ~/ c- H8 Y

5 q  n$ s- f! I+ n     <name>Winter Blanket (78 inch)</name>% j3 p8 A. q2 Q) T+ |

# B# N& b# I+ _9 f9 S! E     <price>20</price>4 v) R6 x' r, G1 ?6 g% W+ `

/ b" G. k& i4 j, F; D0 n. F: W& i     <qty>10</qty>/ x6 m8 L" \) C- z
- _% m4 H( z- x: T5 _
   </item>. F' s5 J( F4 x, {  V' G
( v) F( b& v& k: A
</order>- P# V$ E$ L! L# I, j+ A) Y2 z9 Z
+ J+ `9 x: Q7 T) e  M( q
</orders>
& V; h  |, E0 M4 B- Q8 y' _% e; e在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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