XML 对象模型
------------------------------------------------------------
来源:节选自 实战XML第二版(ScriptXML):Appendix A XML 对象模型
这个附录将详细地探究XML 对象模型,包括组成模型的对象、它们的属性与方法,和他们如何被应用在应用程序中。
对象模型结构
对象是一种树状结构的组织。树的主干便是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);v</DIV></TD></TR></TBODY></TABLE>
<DIV class=content>nodeValue 属性
-----------------
传回指定节点相关的文字。这并非一个元素中数据的值,而是与一个节点相关且未解析的文字,就像一个属性或者一个处理指令。
基本语法:
varNodeValue = xmlDocNode.nodeValue;
说明:传回的文字代表以节点的nodeType 属性为主的型态值。(请参考附录中的nodeType 属性。)因为节点型态可能是几种数据型态中的一种,传回值也因此有差异。传回null 的节点型态
有:DOCUMENT、ELEMENT、DOCUMENT TYPE、DOCUMENT FRAGMENT、ENTITY、ENTITY REFERENCE,和NOTATION。此属性可擦写。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_15.htm:
varNodeValue = xmlDoc.documentElement.nodeValue;
alert(varNodeValue);
ondataavailable 属性
---------------------
指定一个事件来处理ondataavailable 事件。(更多关于ondataavailable 事件的信息,请参阅附录中<Document 对象事件>的部分)。
基本语法:
xmlDocNode.ondataavailable = value;
说明:此属性是唯写,允许文件作者一旦数据为可用,即可尽快的使用数据来运作。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_16.htm:
xmlDoc.ondataavailable = alert("Data is now available.");
onreadystatechange 属性
------------------------
指定一个事件来处理onreadystatechange 事件。这个事件能辨识readyState 属性的改变。(更多有关onreadystatechange 事件的信息,请参阅附录中<Document 对象事件> 的部分。)
基本语法:
xmlDocNode.onreadystatechange = value;
说明:此属性是唯写的,允许文件作者指定当readyState 属性改变时呼叫事件。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_17.htm:
xmlDoc.onreadystatechange =
alert("The readyState property has changed.");
ownerDocument 属性
-------------------
传回文件的根节点,包含目前节点。
基本语法:
objOwnerDoc = xmlDocument.ownerDocument;
说明:此属性是只读的,传回一个包含文件根节点的对象,包含特定的节点。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_18.htm:
objOwnerDoc = xmlDoc.childNodes.item(2).ownerDocument;
alert(objOwnerDoc);
parentNode 属性
-----------------
传回目前节点的父节点。只能应用在有父节点的节点中。
基本语法:
objParentNode = xmlDocumentNode.parentNode;
说明:此属性是只读的,传回包含指定节点的父节点对象。如果此节点不存在于文件树中,将传回null。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_19.htm:
objParentNode = xmlDoc.childNodes.item(1).parentNode;
alert(objParentNode);
parseError 属性
-----------------
传回一个DOM 解析错误对象,此对象描述最后解析错误的讯息。
基本语法:
objParseErr = xmlDocument.parseError;
说明:此属性是只读的。如果没有错误发生,将传回0。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_20.htm:
objParseErr = xmlDoc.parseError;
alert(objParseErr);
previousSibling 属性
---------------------
传回目前节点之前的兄弟节点。
基本语法:
objPrevSibling = xmlDocument.previousSibling;
说明:传回一个对象,这个属性是只读的。若该节点没有包含前面的兄弟节点,会传回null。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_21.htm:
objPrevSibling =
xmlDoc.documentElement.childNodes.item(3).previousSibling
alert(objPrevSibling);
readyState 属性
-------------------
传回XML 文件资料的目前状况。
基本语法:
intState = xmlDocument.readyState;
说明:这个属性是只读的,传回值有以下的可能:
0-UNINITIALIZED:XML 对象被产生,但没有任何文件被加载。
1-LOADING:加载程序进行中,但文件尚未开始解析。
2-LOADED:部分的文件已经加载且进行解析,但对象模型尚未生效。
3-INTERACTIVE:仅对已加载的部分文件有效,在此情况下,对象模型是有效但只读的。
4-COMPLETED:文件已完全加载,代表加载成功。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_22.htm:
alert("The readyState property is " + xmlDoc.readyState);
url 属性
---------------
传回最近一次加载XML 文件的URL。
基本语法:
strDocUrl = xmlDocument.url;
说明:这个属性是只读的,传回最近一次加载成功文件的URL,若文件仅存在主存储器中(表示该文件并非由外部档案加载),则传回null。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_23.htm:
alert(xmlDoc.url);
validateOnParse 属性
----------------------
告诉解析器文件是否有效。
基本语法:
boolValidate = xmlDocument.validateOnParse;
xmlDocument.validateOnParse = boolValidate;
说明:此属性是可擦写的。如果传回值为true,表示文件被解析时被确认是有效的。如果传回false,表示文件是无效的,并被认为只是标准格式的(well-formed)文件。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_24.htm:
xmlDoc.validateOnParse = true;
alert(xmlDoc.validateOnParse);
xml 属性
------------
传回指定节点的XML 描述和所有的子节点。
基本语法:
xmlValue = xmlDocumentNode.xml;
说明:此属性是只读的。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_25.htm:
xmlValue = xmlDoc.documentElement.xml;
alert(xmlValue);</DIV>
<DIV class=content>
<DIV class=content>(二)、Document 对象方法
以下列出关于Document 对象可用的方法。
1. abort
2. appendChild
3. cloneNode
4. createAttribute
5. createCDATASection
6. createComment
7. createDocumentFragment
8. createElement
9. createEntityReference
10. createNode
11. createProcessingInstruction
12. createTextNode
13. getElementsByTagName
14. hasChildNodes
15. insertBefore
16. load
17. loadXML
18. nodeFromID
19. parsed
20. removeChild
21. replaceChild
22. selectNodes
23. selectSingleNode
24. transformNode
abort 方法
-------------
abort 方法取消一个进行中的异步下载。
基本语法:
xmlDocument.abort();
说明:如果这个方法在异步下载时被呼叫,所有的解析动作会停止,而且在内存中的文件会被释放。
AppendChild 方法
------------------
加上一个节点当作指定节点最后的子节点。
基本语法:
xmlDocumentNode.appendChild(newChild);
说明:newChild 是附加子节点的地址。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_26.htm:
docObj = xmlDoc.documentElement;
alert(docObj.xml);
objNewNode = docObj.appendChild(xmlDoc.documentElement. firstChild);
alert(docObj.xml);
cloneNode 方法
---------------
建立指定节点的复制。
基本语法:
xmlDocumentNode.cloneNode(deep);
说明:deep 是一个布尔值。如果为true,此节点会复制以指定节点发展出去的所有节点。如果是false,只有指定的节点和它的属性被复制。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_27.htm:
currNode = xmlDoc.documentElement.childNodes.item(1);
objClonedNode = currNode.cloneNode(1);
alert(objClonedNode.xml);
createAttribute 方法
------------------------
建立一个指定名称的属性。
基本语法:
xmlDocument.createAttribute(name);
说明:name 是被建立属性的名称。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_28.htm:
objNewAtt = xmlDoc.createAttribute("encryption");
alert(objNewAtt.xml);
createCDATASection 方法
------------------------
建立一个包含特定数据的CDATA。
基本语法:
xmlDocument.createCDATASection(data);
说明:date 是一个字符串,且包含了被置放在CDATA 的资料。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_29.htm:
objNewCDATA = xmlDoc.createCDATASection("This is a CDATA Section");
alert(objNewCDATA.xml);
createComment 方法
-------------------
建立一个包含指定数据的批注。
基本语法:
xmlDocument.createComment(data);
说明:data 是一个字符串,且包含了被置放在批注的资料。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_30.htm:
objNewComment = xmlDoc.createComment("This is a comment");
alert(objNewComment.xml);
createDocumentFragment 方法
-----------------------------
建立一个空的文件片断对象。
基本语法:
xmlDocument.createDocumentFragment();
说明:一个新的文件片断被建立,但没有加到文件树中。要加入片断到文件树中,必须使用插入方法,例如insertBefore、replaceChild 或appendChild。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_31.htm:
objNewFragment = xmlDoc.createDocumentFragment();
alert(objNewFragment.xml);
createElement 方法
--------------------
建立一个指定名称的元素。
基本语法:
xmlDocument.createElement(tagName);
说明:tagName 是一个区分大小写的字符串来指定新元素名称。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_32.htm:
objNewElement = xmlDoc.createElement("TO");
alert(objNewElement.xml);
createEntityReference 方法
-----------------------------
建立一个参照到指定名称的实体。
基本语法:
xmlDocument.createEntityReference(name);
说明:name 是一个区分大小写的字符串,来指定新实体参照的名称。一个新的实体参照被建立,但是并没有被加到文件树中。若要将实体参照加到文件树中,必须使用一种插入方法,例如:insertBefore,replaceChild,或appendChild。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_33.htm:
objNewER = xmlDoc.createEntityReference("eRef");
alert(objNewER.xml);
createNode 方法
----------------------
建立一个指定型态、名称,及命名空间的新节点。
基本语法:
xmlDocument.createNode(type, name, nameSpaceURI);
说明:type 用来确认要被建立的节点型态,name 是一个字符串来确认新节点的名称,命名空间的前缀则是选择性的。nameSpaceURI 是一个定义命名空间URI 的字符串。如果前缀被包含在名称参数中,此节点会在nameSpaceURI 的内文中以指定的前缀建立。如果不包含前缀,指定的命名空间会被视为预设的命名空间。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_34.htm:
objNewNode = xmlDoc.createNode(1, "TO", "");
alert(objNewNode.xml);
createProcessingInstruction 方法
-----------------------------------
建立一个新的处理指令,包含了指定的目标和数据。
基本语法:
xmlDocument.createProcessingInstruction(target, data);
说明:target 是表示目标、名称或处理指令的字符串。Data 是表示处理指令的值。一个新的处理指令被建立,但是并没有加到文件树中。要把处理指令加到文件树中,必须使用插入方法,例如:insertBefore、replaceChild,或是appendChild。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_35.htm:
objNewPI =
xmlDoc.createProcessingInstruction(‘XML’, ‘version="1.0"’);
alert(objNewPI.xml);
createTextNode 方法
------------------------
建立一个新的text 节点,并包含指定的数据。
基本语法:
xmlDocument.createTextNode(data);
-
说明:data 是一个代表新text 节点的字符串。一个新的text 节点被建立,但是没有加到文件树中。若要将节点加到文件树中,必须使用插入方法,例如:insertBefore,replaceChild或appendChild。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_36.htm:
objNewTextNode = xmlDoc.createTextNode("This is a text node.");
alert(objNewTextNode.xml);
getElementsByTagName 方法
-----------------------------
传回指定名称的元素集合。
基本语法:
objNodeList = xmlDocument.getElementsByTagName(tagname);
说明:tagname 是一个字符串,代表找到的元素卷标名称。使用tagname "*"传回文件中所有找到的元素。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_37.htm:
objNodeList = xmlDoc.getElementsByTagName("*");
alert(objNodeList.item(1).xml);
haschildnodes 方法
----------------------
如果指定的节点有一个或更多子节点,传回值为true。
基本语法:
boolValue = xmlDocumentNode.hasChildNodes() ;
说明:如果此节点有子节点传回值为true,否则传回false 值。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_38.htm:
boolValue = xmlDoc.documentElement.hasChildNodes();
alert(boolValue);</DIV>
<DIV class=content>
<DIV class=content>insertBefore 方法
---------------------
在指定的节点前插入一个子节点。
基本语法:
objDocumentNode = xmlDocumentNode.insertBefore(newChild,refChild);
-
说明:newChild 是一个包含新子节点地址的对象,refChild 是参照节点的地址。新子节点被插到参照节点之前。如果refChild 参数没有包含在内,新的子节点会被插到子节点列表的末端。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_39.htm:
objRefNode = xmlDoc.documentElement;
alert(xmlDoc.xml);
objNewNode = xmlDoc.createComment("This is a comment");
xmlDoc.insertBefore(objNewNode, objRefNode);
alert(xmlDoc.xml);
load 方法
--------------
表示从指定位置加载的文件。
基本语法:
boolValue = xmlDocument.load(url);
说明:url 包含要被加载档案的URL 的字符串。假如文件加载成功,传回值即为true。若加载失败,传回值为false。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_40.htm:
boolValue = xmlDoc.load("LstA_1.xml");
alert(boolValue);
loadXML 方法
----------------
加载一个XML 文件或字符串的片断。
基本语法:
boolValue = xmlDocument.loadXML(xmlString);
说明:xmlString 是包含XML 文字码的字符串。
这个字符串可以包含整个文件或者只是一个文件片断。如果文件加载成功,传回值为true。假如加载失败,传回值则是false。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_41.htm:
xmlString = "<GREETING><MESSAGE>Hello!</MESSAGE></GREETING>";
boolValue = xmlDoc.loadXML(xmlString);
alert(boolValue);
nodeFromID 方法
------------------
传回节点ID 符合指定值的节点。
基本语法:
xmlDocumentNode = xmlDocument.nodeFromID(idString);
说明:idString 是一个包含ID 值的字符串。符合的节点必定是ID 型态。若符合,将传回一个对象;若操作失败,则传回null。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_42.htm:
objDocumentNode = xmlDoc.nodeFromID("TO");
alert(objDocumentNode);
parsed 方法
-------------
会验证该指定的节点(node)及其衍生的子节点(descendants)是否已被解析过。
基本语法:
boolValue = xmlDocumentNode.parsed();
说明:如果全部的节点都已经被解析过了,则传回值为ture;如果有任何一个节点尚未被解析,传回值则为false。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_43.htm:
currNode = xmlDoc.documentElement.childNodes.item(0);
boolValue = currNode.parsed();
alert(boolValue);
removeChild 方法
-------------------
会将指定的节点从节点清单中移除。
基本语法:
objDocumentNode = xmlDocumentNode.removeChild(oldChild);
说明:oldChild 为一个包含要被移除的节点对象。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_44.htm:
objRemoveNode = xmlDoc.documentElement.childNodes.item(3);
alert(xmlDoc.xml);
xmlDoc.documentElement.removeChild(objRemoveNode);
alert(xmlDoc.xml);
replaceChild 方法
--------------------
置换指定的旧子节点为提供的新子节点。
基本语法:
objDocumentNode = xmlDocumentNode.replaceChild(newChild,oldChild);
-
说明:newChild 为包含新子节点的对象。如果此参数为null,则此旧子节点会被移除而不会被取代。oldChild 为包含旧子节点的对象。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_45.htm:
objOldNode = xmlDoc.documentElement.childNodes.item(3);
objNewNode = xmlDoc.createComment("I've replaced the BCC element.");
alert(xmlDoc.xml);
xmlDoc.documentElement.replaceChild(objNewNode,objOldNode);
alert(xmlDoc.xml);
selectNodes 方法
--------------------
传回所有符合提供样式(pattern)的节点。
基本语法:
objDocumentNodeList = xmlDocumentNode.selectNodes(patternString);
-
说明:patternString 为一包含XSL 样式的字符串。此方法会传回节点清单对象,包含符合样式的节点。如果没有符合的节点,则传回空的清单列表。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_46.htm:
objNodeList=xmlDoc.selectNodes("/");
alert(objNodeList.item(0).xml);
selectSingleNode 方法
--------------------------
传回第一个符合样式的节点。
基本语法:
objDocumentNode = xmlDocumentNode.selectSingleNode(patternString);
说明:patternString 为一包含XSL 样式的字符串。此方法会传回第一个符合的节点对象,如果没有符合的节点,则传回null。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_47.htm:
objNode = xmlDoc.selectSingleNode("EMAIL/BCC");
alert(objNode.xml);
transformNode 方法
----------------------
使用提供的样式表来处理该节点及其子节点。
基本语法:
strTransformedDocument = xmlDocumentNode.transformNode(stylesheet);
说明:stylesheet 为一XML 文件或是片断包含负责节点转换工作的XSL 元素。此方法会传回一包含转换结果的字符串。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_48.htm:
-
var style = new ActiveXObject("Microsoft.XMLDOM");
style.load("LstA_49.xsl");
strTransform = xmlDoc.transformNode(style.documentElement);
alert(strTransform);
---------------------------------------------------------------------------------
[Note]
想更进一步了解有关XSL 的细节,请参阅第8 章及第9 章。
---------------------------------------------------------------------------------
(三)、Document 对象的事件
下面列出来的是Document 对象可用的事件:
1. Ondataavailable
2. Onreadystatechange
Ondataavailable 事件
----------------------
此事件会在XML 文件有效时被触发。
基本语法:
此一事件有下面三种处理方式
. Inline:<element ondataavailable = handler>;
. Event property:object.ondataavailable = handler;
. Named script:<SCRIPT FOR = object EVENT = ondataavailable>;
说明:ondataavailable 事件只要一获得有效的数据就会被触发。这项技术并未说明在这个文件中有多少数据是有效的。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_50.htm:
xmlDoc.ondataavailable = alert('Data is now available.');</DIV>
<DIV class=content>
------------------
说明一个节点的值是否在元素中被确切地指定,或者是否从DTD 或结构(schema)中取得,此一属性通常被用来当做属性的值。
基本语法:
boolSpecified = xmlDocumentNode.specified;
说明:此一属性只读且会传回一布尔值。若该值在元素中被指定则传回值为true,但若是来自DTD 或结构(schema)则传回值为false。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_59.htm:
objNode = xmlDoc.documentElement.childNodes.item(0);
alert(objNode.specified);
text 属性
---------------
取得或设定节点的文字。
基本语法:
strText = xmlDcoumentNode.text;xmlDocumentNode.text = strText;
说明:此属性为一可供读写的字符串值。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_60.htm:
objNode = xmlDoc.documentElement.childNodes.item(0);
alert(objNode.text);</DIV>
<DIV class=content>
<DIV class=content>(二)、节点对象的方法
以下所列为节点对象可用的方法:
1. appendChild
2. cloneNode
3. hasChildNodes
4. insertBefore
5. parsed
6. removeChild
7. replaceChild
8. selectNodes
9. selectSingleNode
10. transformNode
hasChildNodes 方法
----------------------
如果指定的节点有一个以上的子节点则传回true。
基本语法:
boolValue = xmlDocumentNode.hasChildNodes();
说明:此一方法只读且会传回一布尔值。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_61.htm:
objNode = xmlDoc.documentElement;
alert(objNode.hasChildNodes());
三、nodeList 物件
nodeList 对象为一在文件树中主动节点集合,「主动」的意思为只要nodeList 对象有任何改变就会立即反应到集合中。
(一)、nodeList 对象的属性
length 属性是nodeList 对象的唯一属性。
length 属性
--------------
传回集合中项目的个数。
基本语法:
intValue = xmlNodeList.length;
说明:此一属性只读且会传回一长整数值。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_62.htm:
objNodeList = xmlDoc.documentElement.childNodes;
alert(objNodeList.length);
(二)、nodeList 对象的方法
下面列出nodeList 对象可用的方法。
1. item
2. nextNode
3. reset
item 方法
--------------
存取文件树中的单一节点。
基本语法:
objDocumentNode = xmlNodeList.item(index);
说明:index 为长整数指定子节点的index(0-based)。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_63.htm:
objNode = xmlDoc.documentElement.childNodes.item(2);
alert(objNode.xml);
nextNode 方法
----------------
存取集合中的下一个节点。
基本语法:
objDocumentNode = xmlNodeList.nextNode();
说明:传回包含下一个节点的对象。若无法取得下一个节点则传回null。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_64.htm:
objNode = xmlDoc.documentElement.childNodes;
objNextNode = objNode.nextNode();
alert(objNextNode.xml);
objNextNode = objNode.nextNode();
alert(objNextNode.xml);
reset 方法
----------------
重新设定节点清单列表中的索引(index)指针。
基本语法:
objDocumentNode = xmlNodeList.reset();
说明:设定节点清单列表中的指针指向第一个节点的前面。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_65.htm:
objNode = xmlDoc.documentElement.childNodes;
objNextNode = objNode.nextNode();
alert(objNextNode.xml);
objNode.reset();
objNextNode = objNode.nextNode();
alert(objNextNode.xml);
四 、parseError 物件
parseError 对象传回最后一个解析错误的信息。
要示范parseError 对象如何运作,我们需要使用一份有错误的XML 文件,如下文字码A-1a 所示(在随书光盘中AppxA\Lsta_1a.xml),是一份保有Cc、Bcc 元素的电子邮件文件,根据DTD 这是一篇错误的电子邮件文件。
<?xml version="1.0"?>
<!DOCTYPE EMAIL SYSTEM "LstA_2.dtd">
<EMAIL PRIORITY="HIGH">
<TO>[email protected]</TO>
<FROM>[email protected]</FROM>
<BCC>[email protected]</BCC>
<CC>[email protected]</CC>
<SUBJECT>My document is a tree.</SUBJECT>
<BODY>This is an example of a tree structure.</BODY>
</EMAIL>
[文字码A-1a]
(一)、parseError 对象的属性
以下所列为parseError 对象可用的属性:
1. errorCode
2. filePos
3. line
4. linePos
5. reason
6. srcText
7. url
errorCode 属性
--------------------
传回最后一个解析错误的错误码。
基本语法:
intErrorValue = xmlDocument.parseError.errorCode;
说明此一属性只读且会传回一长整数。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_66.htm:
intParseValue = xmlDoc.parseError.errorCode;
alert(intParseValue);
filePos 属性
----------------
传回档案中错误发生的位置。
基本语法:
intErrorValue = xmlDocument.parseError.filePos;
说明:此一属性只读,且会传回表示绝对位置的长整数(以字符数表示)。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_67.htm:
intParseValue = xmlDoc.parseError.filePos;
alert(intParseValue);
line 属性
---------------
传回错误发生所在的行数。
基本语法:
intErrorValue = xmlDocument.parseError.line;
说明此一属性只读,且会传回表示错误发生所在行数的长整数。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_68.htm:
intParseValue = xmlDoc.parseError.line;
alert(intParseValue);
linePos 属性
----------------
传回错误发生在行中的哪个位置。
基本语法:
intErrorValue = xmlDocument.parseError.linePos;
说明:此一属性只读,且会传回一长整数表示错误发生在行中的哪一个字符位置。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_69.htm:
intParseValue = xmlDoc.parseError.linePos;
alert(intParseValue);
reason 属性
-----------------
传回最后一个错误发生的原因。
基本语法:
strErrorReason = xmlDocument.parseError.reason;
说明:此一属性只读,且会传回最后一个解析错误发生原因的叙述字符串。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_70.htm:
strErrorReason = xmlDoc.parseError.reason;
alert(strErrorReason);
srcText 属性
----------------
传回错误发生处该行的文字。
基本语法:
strSrcText = xmlDocument.parseError.srcText;
说明:此一属性只读。传回错误发生处该行完整的文字,而且包含空格。
使用范例:
以下的范例请参照随书光盘中的AppxA\LstA_71.htm:
strSrcText = xmlDoc.parseError.srcText;
alert(strSrcText);
本文地址:http://com.8s8s.com/it/it42031.htm