+ -
当前位置:首页 → 问答吧 → 【推荐】 XML文档对象模型手册1

【推荐】 XML文档对象模型手册1

时间:2004-02-11

来源:互联网

XML 对象模型

------------------------------------------------------------
来源:节选自 实战XML第二版(ScriptXML):Appendix A XML 对象模型
整理: FREETA
日期: 2003-10-25


   第5 章谈论了如何使用Script 在HTML 网页中与组件互相整合,以及如何与XML 对象模型合作。这个附录将详细地探究XML 对象模型,包括组成模型的对象、它们的属性与方法,和他们如何被应用在应用程序中。

对象模型结构

   正如同我们在第3 章所讨论的,对象是一种树状结构的组织。树的主干便是Document 对象,其它的对象便由此对象分支而来。

XML 对象模型由四种基本的对象所组成:

. document 对象-XML 数据来源
. node 对象-一个父节点或其中的一个子节点
. nodeList 对象—兄弟节点的清单
. parseError 对象—一个无内容的对象,用来接收解析错误的讯息

图A-1 显示了这些对象间的关系。

DOCUMENT
   |
   |         |------------NODE
   |-------NODE-------|------------NODE
   |         |------------NODE
   |
   |--------------NODE            
           |--------------NODE
           |--------------NODE
           |--------------NODE  
                                    
                              图A-1:XML 对象模型

   在对象模型中的每个对象拥有特定的属性或方法,或两者都有。若使用Script 程序代码,内容作者可以直接地使用这些属性和方法来取得信息并运用XML 数据。这个附录将完整地介绍XML对象模型,并检视这些对象和相关的属性与方法。
   既然本书是讨论如何运用XML 的,就必须深入了解对象模型的运作。稍后在这附录中,有一些如何在对象模型中使用对象的范例。要使用这些范例,您将需要列在A-1 中的文字码,也可以在随书光盘中找到它(Appxa\LastA_1.xml)。

<?xml version="1.0"?>
<!DOCTYPE EMAIL SYSTEM "LstA_2.dtd">
<EMAIL PRIORITY="HIGH">
<TO>[email protected]</TO>
<FROM>[email protected]</FROM>
<CC>[email protected]</CC>
<BCC>[email protected]</BCC>
<SUBJECT>My document is a tree.</SUBJECT>
<BODY>This is an example of a tree structure.</BODY>
</EMAIL>

                                  [文字码A-1]

  您可以从文件类型宣告中看到,这份文件使用了DTD。这份DTD 文件如文字码A-2 所示,您也可以在随书光盘中的AppxA\LstA_2.dtd 找到它。

<!-- This is an XML document that could be used as an email template. -->
<!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)>
<!ATTLIST EMAIL
LANGUAGE (Western|Greek|Latin|Universal) "Western"
ENCRYPTED CDATA #IMPLIED
PRIORITY (NORMAL|LOW|HIGH) "NORMAL">
<!ELEMENT TO (#PCDATA)>
<!ELEMENT FROM (#PCDATA)>
<!ELEMENT CC (#PCDATA)>
<!ELEMENT BCC (#PCDATA)>
<!ATTLIST BCC
HIDDEN CDATA #FIXED "TRUE">
<!ELEMENT SUBJECT (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>

                                  [文字码A-2]

   最后,XML 文件将透过HTML 网页来显示,下面便是HTML 的文字码(在随书光盘AppxA\LstA_3.htm 中)。

<!DOCTYPE HTML PUBLIC "_//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScrip"_ FOR=window EVENT=onload>
showMe();
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
var xmlDoc = new ActiveXObject("microsoft.xmldom");
xmlDoc.load("LstA_1.xml");
function showMe()
{
// Insert sample code here.
}
</SCRIPT>
<TITLE>Code Listing A-3</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>

                                                                          [文字码A-3]

请注意在A-3 文字码中,showMe 函式并没有包含程序代码。因为要插入什么程序代码是由您来决定的,这个程序片段只是要让您了解showMe 函式的功用。
---------------------------------------------------------------------------------
[Note]
使用附录中的范例时,您可以在LstA_3.htm 的showMe 函式中输入片断程序代码,也可以使用随书光盘中AppxA 目录中的HTML 档案。
---------------------------------------------------------------------------------






一、Document 物件

  如同前面所提到的,这Document 对象代表这份文件的数据来源。这个对象模型允许文件作者使用任何支持XML 处理器的浏览器或应用程序,透过script 程序代码来加载XML 文件。
举例来说,一个文件能藉由建立一个ActiveX control 的实例,并且呼叫load 方法(稍后讨论)来加载文件,如同范例中的HTML 码:

var xmlDoc = new ActiveXObject("microsoft.xmldom");
xmlDoc.load("LstA_1.xml");

加载也可借着使用Java applet 来完成,如下所示:

<SCRIPT>
xmldso.load("LstA_1.xml");
</SCRIPT>
<BODY>
<APPLET CODE=com.ms.xml.dso.XMLDSO.class
WIDTH=100% HEIGHT=0 ID=xmldso MAYSCRIPT=true>
</APPLET>
</BODY>

因为对象模型预期将会使用load 方法,因此,程序代码与控件被加载后的程序代码是相同的。重要的是,一旦数据来源被建立后,对象模型便会提供一致的方式来浏览及处理XML 资料。
---------------------------------------------------------------------------------
[Note]
Msxml 延伸基本的Document 对象模型(DOM),来包含XML 特定的界面。讨论DOM 的概念超出本书的范围。所以,下面的单元只把焦点集中在XML DOM 的一般性使用。
---------------------------------------------------------------------------------




(一)、Document 对象属性



以下所列是可用的Document 对象属性:
1. async
2. attributes
3. childNodes
4. doctype
5. documentElement
6. firstChild
7. implementation
8. lastChild
9. nextSibling
10. nodeName
11. nodeType
12. nodeValue
13. ondataavailable
14. onreadystatechange
15. ownerDocument
16. parentNode
17. parseError
18. previousSibling
19. readyState
20. url
21. validateOnParse
22. xml


async 属性
------------------

async 属性表示是否允许异步的下载。

基本语法:

boolValue = XMLDocument.async;XMLDocument.async = boolValue;
-
说明:布尔值是可擦写的(read/write),如果准许异步下载,值为True;反之则为False。

使用范例:

以下的范例请参照随书光盘的AppxA\LstA_4.htm:
xmlDoc.async = "false";
alert(xmlDoc.async);


attribute 属性
-------------------

传回目前节点的属性列表。

基本语法:

objAttributeList = xmlNode.attributes;
说明:传回一个物件。如果此节点不能包含属性,则传回空值。

使用范例:

以下的范例请参照随书光盘的AppxA\LstA_5.htm:
objAttList = xmlDoc.documentElement.attributes;
alert(objAttList);

------------------------------------------------------------------------------
[Note]
例子以[object]为结果传回。这是由于被传回的对象,若不使用其它的对象属性,就不能以文字来表示,在本附录中包含数个这样的例子。尽管很多对象属性本身似乎不是很有用,但您将会在附录中看到如何组合属性和方法得到您要的结果。
------------------------------------------------------------------------------


childNodes 属性
-----------------

传回一个节点清单,包含该节点所有可用的子节点。

基本语法:

objNodeList=node.childNodes;
说明:传回一个物件。假如这节点没有子节点,传回null。

使用范例:

以下的例子请参照随书光盘中的AppxA\LstA_6.htm:
objNodeList = xmlDoc.childNodes;
alert(objNodeList);


doctype 属性
-----------------

传回文件型态节点,包含目前文件的DTD。这节点是一般的文件型态宣告,例如,节点<!DOCTYPE EMAIL SYSTEM "LstA_2.dtd">,名为EMAIL 的节点物件会被传回。

基本语法:

objDocType=xmlDocument.doctype;
说明:传回一个对象,这个属性是只读的。假如这文件不包含DTD,会传回null。

使用范例:

以下的例子请参照随书光盘AppxA\LstA_7.htm:
objDocType = xmlDoc.doctype;
alert(objDocType.nodeName);
documentElement 属性


确认XML 文件的根(Root)节点。
----------------------------

基本语法:

objDoc=xmlDocument.documentElement;
说明:回一个在单一根文件元素中包含数据的对象。此属性可读/写,如果文件中不包含根节点,将传回null。

使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_8.htm:
objDocRoot = xmlDoc.documentElement;
alert(objDocRoot);


firstChild 属性
-----------------

确认在目前节点中的第一个子元素。

基本语法:

objFirstChild = xmlDocNode.firstChild ;
说明:此属性只读且会传回一对象,如果节点中没有包含第一个子元素,将传回null。

使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_9.htm:
objFirstChild = xmlDoc.documentElement.firstChild;
alert(objFirstChild);


implementation 属性
---------------------

DOM 应用程序能使用其它实作中的对象。implementation 属性确认目前XML 文件的DOMimplementation 对象。

基本语法:

objImplementation = xmlDocument.implementation;
说明:此属性只读且传回一个对象。

使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_10.htm:
objImp = xmlDoc.implementation;
alert(objImp);


lastChild 属性
---------------

确认目前节点中最后的子元素。

基本语法:

objLastChild = xmlDocNode.lastChild;
说明:此属性只读且传回一个对象。如果节点中没有包含最后子元素,将传回null。

使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_11.htm:
objLastChild = xmlDoc.documentElement.lastChild;
alert(objLastChild);


nextSibling 属性
------------------

在目前文件节点的子节点列表中传回下一个兄弟节点。

基本语法:

objNextSibling = xmlDocNode.nextSibling;
说明:此属性是只读且传回一个对象。如果节点中没有包含其它的相关节点,会传回null。

使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_12.htm:
objSibling = xmlDoc.documentElement.childNodes.item(1) .nextSibling;
alert(objSibling);


nodeName 属性
---------------

传回代表目前节点名称的字符串。

基本语法:

strNodeName = xmlDocNode.nodeName ;
说明:传回一个字符串。这个属性是只读的,传回元素名称、属性或实体参照。

使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_13.htm:
strNodeName = xmlDoc.documentElement.nodeName;
alert(strNodeName);


nodeType 属性
---------------

辨识节点的DOM 型态。

基本语法:
numNodeType = xmlDocNode.nodeType ;
说明:此属性只读且传回一个数值。

有效的数值符合以下的型别:
1-ELEMENT
2-ATTRIBUTE
3-TEXT
4-CDATA
5-ENTITY REFERENCE
6-ENTITY
7-PI (processing instruction)
8-COMMENT
9-DOCUMENT
10-DOCUMENT TYPE
11-DOCUMENT FRAGMENT
12-NOTATION
-------------------------------------------------------------------------------
[Note]
上述的数据型态将在附录B 中有更深入的介绍。
-------------------------------------------------------------------------------
使用范例:

以下的范例请参照随书光盘中的AppxA\LstA_14.htm:
numNodeType = xmlDoc.documentElement.nodeType;
alert(numNodeType);

作者: yjc2020   发布时间: 2004-02-11

太好了,正是我想要的

作者: yjc2020   发布时间: 2004-02-23

个人推荐 MSDN 中的 XML Core

作者: sendidmax   发布时间: 2004-03-06

请问这是节选的哪本书啊?网上有卖的吗?全名呢?

作者: snakevil   发布时间: 2004-03-07

作者: zzsww   发布时间: 2004-04-05

好     顶一下

作者: abao006   发布时间: 2004-04-12

希望楼主继续把其他的都贴出来~~~
谢谢!!

作者: EasyDreamer   发布时间: 2004-09-18

dengdai...

作者: HHH3000   发布时间: 2004-09-21