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

DOM的一些概念

6 E; y9 f9 \: C. z+ q
开放分类: 互连网、网页制作、web技术$ E! H) g, @+ D% Z  ^! h1 ?( o
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
/ v; J  _) n6 ]3 J- v. d% J" g4 |6 k- c0 K" j0 H: W# D
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。" S8 b/ m  m8 D( Y2 p, y
! |6 N% l6 B& y
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
2 D8 g+ O0 ^* a- RSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。/ ]! Y: b4 o( o( H! ^. [5 j/ b: f

% {3 B5 \/ o1 p. z另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段( u+ J/ r. s; w, R3 j3 p! s6 f0 Q. H

* @4 v) s/ l. q+ P解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
- T6 C1 H6 K: o5 f4 T$ l! g6 B* H
作为 API 的 DOM4 u7 \! O5 @* E% E, `" t+ w
" N2 D" J# X; e+ e' T3 K
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
8 K- J8 ]- f  X) j) a) c: ?) _$ r( k' r. N& t! z  r
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
& I3 c# N" A  R# _& v* U
/ r3 a! c# e& H+ ?DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
$ A& B% f( g2 O! j
' d0 d! x# q9 ~7 K当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。- t; A( \. _8 j; e7 p7 u
# Q" q1 @& M8 H- @: I( {
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。6 M9 \9 q8 _! P* F
- `% r: U8 f2 J$ h9 S3 H5 O
确定特性可用性" t9 I& T" Q" z& A' X$ C5 G: }' y7 F

5 f, _- |9 X# w9 Z! o/ Z% NDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。3 ?7 ~( L" I8 b; d" \2 a4 E3 f- `' C
- O" B$ F) x4 ~4 z: K, h8 f% G
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
+ }- J3 L1 v* k) M' J7 @7 ]( l/ y1 h/ Q: W! f
import javax.xml.parsers.DocumentBuilderFactory;! ]. H; k, Y4 x4 H
( E5 ]- B1 B$ r) b; _" Y- M
import javax.xml.parsers.DocumentBuilder;
7 x# q$ D9 Y1 Q0 U* S! p1 s0 S- ?- q, Y3 B& z$ @
import org.w3c.dom.DOMImplementation;
8 d0 X- O) U! O1 Y
! c$ D6 `- o* ]; v8 tpublic class ShowDomImpl {: r' y3 b' P& \& }  @
+ i2 T! N2 m& @& s8 x* ^  S- I0 G
public static void main (String args[]) {& R4 n8 S1 J) A/ L
6 r3 e8 u, L; C- R! f' B% _
try {3 s# f0 P) J, _/ s$ p

( h/ M, V  S: S' m8 IDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();: g1 L* }# l1 i, D
0 [# {7 f( G0 x0 p
DocumentBuilder docb = dbf.newDocumentBuilder();
/ V: k1 B. {. w- `6 M1 e5 |0 t) e, t4 O6 N
DOMImplementation domImpl = docb.getDOMImplementation();
# l0 f' R" I( X# f! Q5 z6 ~/ C" z: G& M
if (domImpl.hasFeature("StyleSheets", "2.0")) {2 Z' N* [7 K  D( H8 ~8 W
- {/ Z6 m8 p  \8 i$ W# U( e
System.out.println("Style Sheets are supported.");% l* d9 a$ \1 e5 U- x/ G
1 n9 n& V& x; S$ R
} else {
! O1 [1 U( B( {$ O7 k5 W  c0 m7 J' f, ~
System.out.println("Style Sheets are not supported.");
5 r8 Y. G" S- O+ ^6 [2 S) ?- }$ C& k* V
}
2 |' H7 D1 _9 j! m, C. ^4 ?: U, o8 e5 a5 j/ D. C4 ~
} catch (Exception e) {}
9 y' U; `+ g1 `. o9 w: B6 g1 }" }& f- g: t" Q) H- _: K  ^) Z
}# y$ g) H. O* I: d* J+ u. H8 l: [

5 G5 z3 Y( h' {: p) j}" S1 a% I% T+ k

: v3 q/ q% T( L1 H" {  z  ]2 {(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
8 Q4 P) r( L6 k! N& I" @; _8 ]8 D# H! |) m) {; T# T& i
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
; @$ w) W1 o( _9 m7 X; r+ m3 I; A9 K5 T+ K; B7 |) k8 x5 l
基本的 XML 文件
% }, V, Z# L& v' V) f) E
8 E% u5 o, F& ?5 F1 n本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:: J) X5 a4 W$ d1 b

$ I3 L5 c" {/ o' O% K) AXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。3 u5 ^5 o" \$ A3 t6 j8 S- _

. s+ K: R. l" dDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。5 _2 V& D3 ?5 n, d/ N

+ e: ?' V5 T* T数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。% X2 `8 ^2 l* s3 `" s, z
8 D0 U$ ?' x: T( q& z, U
<?xml version="1.0" encoding="UTF-8"?>
+ |. J6 ~6 v$ y: I6 U
: C8 ]+ ^% J" I7 N' Q  Q' o( U<!DOCTYPE ORDERS SYSTEM "orders.dtd">) f; w" O; A. y2 B0 u

. w! {/ q: A) b* l- @& l7 J<orders>' y' P4 ^  y$ T7 @4 Y# y
7 r, U+ N* e8 _7 |
   <order>+ n& R1 Z; @, J. L  V

. g6 |- m6 ~3 ?' @7 [% Y" ?       <customerid limit="1000">12341</customerid>
) b1 H7 @/ \5 O
5 C' L; [4 R4 C) q  G$ ^6 [/ g       <status>pending</status>8 C& v6 z+ N, F" `: Z! V" e0 \8 y
3 S! L: ^0 h4 Z( T* q, Q3 X
       <item instock="Y" itemid="SA15">
7 @- u9 }1 u) Z' S' ~9 P! q$ u  n( n- `$ V; d+ J
          <name>Silver Show Saddle, 16 inch</name>  H' b9 p* `4 w5 B: O% X" |
! ~) I6 b# c% Q/ e
          <price>825.00</price>
4 \+ t7 I8 V/ C* O- g# b6 K+ \
: C7 d: t7 C" S          <qty>1</qty>
$ X  J/ B# B) P; D6 m& f
5 T' B" H; L+ N       </item>
2 V  j  y6 K! t: m6 U
2 z7 g7 Z8 c! v) n       <item instock="N" itemid="C49">3 b' z8 j% o) p1 D

" j% E$ L6 D. \2 l  u% Q8 O         <name>;Premium Cinch</name>& ~& o: Q3 p* v4 n9 J  M

4 U& P+ p  N/ s. m$ b         <price>49.00</price>
4 X* e. J+ v- h' Q1 i- ~+ x- q0 L8 o! z
         <qty>1</qty>0 b0 L9 p0 I( ]- G- _) y/ B

5 X1 n/ Q( ]. N       </item>/ x% ]+ S1 h# w( F3 N( c$ o
8 |: h# y  J7 t5 u7 \5 M
  </order># n# b3 h5 w3 c& }7 c! v( x

% ?* ?" _7 V) _; w9 {6 `8 V3 h<order>. M: C" M( V9 P

/ _* V7 x7 N: v8 c   <customerid limit="150">251222</customerid>
$ n0 _5 I! X+ S& T+ _+ s- Y  R# b9 X
   <status>pending</status>* Y( `6 q6 A8 w- u
" w' k$ \/ o+ H! [; {9 b
   <item instock="Y" itemid="WB78">
/ q; F/ [- u( c8 D$ L* l: t2 ^: |  f
     <name>Winter Blanket (78 inch)</name>3 d9 l2 j3 l7 ]4 o( @& B

1 f5 z8 x& X( \* j* t     <price>20</price>) L6 ~8 ^0 p. J7 S0 B
  \+ R' S! |' o) F3 ?4 F9 T
     <qty>10</qty>
/ _1 b0 f4 E4 s2 Y6 O/ E9 N+ I" R: x8 W9 X% h. r8 ~( w
   </item>
5 }* L2 h: _2 n& p4 ?$ l1 ?/ k; m
' f& j8 i* ~1 S6 @3 ?6 q/ N# P7 I</order>
6 A( g* C& e  i# l" S- S- w- @+ q3 A- d0 M
</orders>- M7 o. |" c7 E
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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