ajax – XMLDom – IE


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

此项技术同时应用于Web服务器端和客户端,而不仅仅像过去那样只在Web服务器端才提供XML功能

IE中的?XML DOM使用方法

1,创建
?? ?var oXmlDom = new ActiveXObject(“Microsoft.XmlDom”);
?? 同XMLHttp有多个一样, XMLDOM也有多个版本,

q? Microsoft.XmlDom

q? MSXML2.DOMDocument

q? MSXML2.DOMDocument.3.0

q? MSXML2.DOMDocument.4.0

q? MSXML2.DOMDocument.5.0

要找最新版本的,以获得最全功能?

var oXmlDom = createDocument() ;

function createDocument() {

??? var aVersions = [ “MSXML2.DOMDocument.5.0”,

?????? “MSXML2.DOMDocument.4.0″,”MSXML2.DOMDocument.3.0”,

?????? “MSXML2.DOMDocument”,”Microsoft.XmlDom”

??? ];

?

????? for (var i = 0; i < aVersions.length; i++) {

???????? try {

???????????? var oXmlDom = new ActiveXObject(aVersions[i]);

???????????? return oXmlDom;

???????? } catch (oError) {

?????????????? // 不做任何处理

????? }

??? }

??? throw new Error(“MSXML is not installed.”);

}

?

2,IE中载入XML数据 oXmlDom.load(“myxml.xml”);

?MSXML支持两种载入XML的方法:load()loadXML()Load()方法从Web的指定位置载入一个XML文件。?loadXML()?从字符串载入XML,而不是根据指定的文件名载入XML

?(1) load():

?? ?XMLHttp一样,load()方法可以以同步或异步两种模式载入数据。默认情况下,load()方法采用异步模式;如果要采用同步模式,那么必须将MSXML对象的async属性设置为false,代码如下:

oXmlDom.async = false;

?DOM文档支持onreadystatechange事件处理函数,可以监控readyState属性。因为异步模式是默认选项,因此将async属性设置为true是可选的:

oXmlDom.async = true;

?

oXmlDom.onreadystatechange = function () {

??? if (oXmlDom.readyState == 4) {

????? ?//document完全载入后,进行某些操作

??? }

};

?

oXmlDom.load(“myxml.xml”);

(2)?loadXML()

?var sXml = “<root><person><name>Jeremy McPeak</name></person></root>”;

?oXmlDom.loadXML(sXml);

在此,oXmlDom文档将载入sXml变量中包含的XML数据。loadXML()方法不需要像load()方法那样检查readyState属性,也不需要设置async属性,因为该方法并不涉及服务器请求。

3, 创建且载入数据之后可访问数据,方法如下:???

var oRoot = oXmlDom.documentElement;

var oFirstBook = oRoot.firstChild;

var oFirstBook2 = oRoot.childNodes[0];

选择childNodes集合中的第一项将返回根节点的第一个子节点

var sText = oRoot.childNodes[2].text;

获取特定节点或数值的方法

1)text属性(微软特有的属性)可以得到该节点包含的所有文本节点,该属性相当有用。如果没有text属性,访问文本节点必须:var sText = oRoot.childNodes[2].firstChild.nodeValue; text属性将得到包含当前元素及其子节点的所有文本节点的值,而nodeValue属性只能得到当前节点的值。它虽然是个有用的属性,但可能会返回比预期值更多的内容


2)getAttribute()getElementsByTagName()
????
getAttribute()方法将接受一个包含属性名称的字符串型参数,并返回属性值。如果指定的属性不存在,那么返回的值为null
???? var sAttribute = oFirstChild.getAttribute(“isbn”);

?? getElementsByTagName()方法根据其参数所指定的名字,返回子元素的NodeList
?
?? ?var cBooks = oRoot.getElementsByTagName(“book”); 获取文档中所有的<book/>元素


?

XML DOM文档的遍历与HTML DOM的遍历非常类似,因为它们都是节点层次的结构。节点树的最顶部是documentElement属性,包含文档的根元素。使用表4-1中所列出的属性,可以访问文档中任何元素或属性。

4-1 XML DOM属性

???

???

attributes

包含当前节点属性的数组

childNodes

包含子节点数组

firstChild

指向当前节点的第一个子节点

lastChild

指向当前节点的最后一个子节点

nextSibling

返回当前节点的下一个邻居节点

nodeName

返回当前节点的名字

nodeType

指定当前节点的XML DOM节点类型

nodeValue

包含当前节点的文本

ownerDocument

返回文档的根元素

parentNode

指向当前节点的父节点

previousSibling

返回当前节点的前一个邻居节点

text

返回当前节点的内容或当前节点及其子节点的文本(只有IE才支持的属性)

xml

以字符串返回当前节点及其子节点的XML(只有IE才支持的属性)

4,结点操作
?

l?? 创建节点

使用DOM方法可以创建多种不同的节点。第一种就是用createElement()方法创建的元素。向该方法传入一个参数,指明要创建的元素标签名称,并返回一个对XMLDOMElement的引用:

var oNewBook = oXmlDom.createElement(“book”);

var oNewBookText = oXmlDom.createTextNode(“Professional .NET 2.0 Generics”);

oNewBook.appendChild(oNewBookText);

oNewBook.setAttribute(“isbn”,”0764559885″);

oXmlDom.documentElement.appendChild(oNewBook);

这段代码创建一个新的<book/>元素,并通过appendChild()方法把它添加到documentElement中。appendChild()方法添加由其参数指定的新元素,并且将其作为最后一个子节点

l?? 删除、替换和插入节点

删除
removeChild()方法正是用来实现该功能的。该方法包含一个参数:要删除的节点。例如,要从文档中删除第一个<book/>元素,则可以使用以下代码:var oRemovedChild = oRoot.removeChild(oRoot.firstChild);

替换
通过replaceChild()方法来实现,该方法返回被替换的节点:
var oReplacedChild = oRoot.replaceChild(oRemovedChild, oRoot.childNodes[2]);
replaceChild()方法接受两个参数:新添加的节点和将被替换的节点

插入节点
nsertBefore()方法将该节点插入到某个节点之前:
oRoot.insertBefore(oReplacedChild, oRoot.lastChild);

这段代码将之前被替换的节点插入到最后一个<book/>元素的前面

5,异常捕获

XML数据的载入过程中,可能会由于不同的原因而抛出错误。例如,外部的XML文件找不到,或者XML的格式不正确。为了处理这些情况,MSXML提供了一个包含错误信息的parseError对象。对于每个由MSXML创建的XML DOM文档对象而言,该对象都是其所属的属性值之一。

可以通过parseError对象公开的与整数0进行比较的errorCode属性来检查错误。errorCode属性可以是正数也可以是负数,只有当errorCode为0时才表示没有错误发生。

if (oXmlDom.parseError.errorCode != 0) {

??? alert(“An Error Occurred: ” + oXmlDom.parseError.reason);

} else {

??? //XML载入成功后的操作

}

若想进一步了解错误信息,可通过使用parseError对象的reason属性来获取错误出现的原因。

parseError对象提供了以下属性,

q? errorCode:错误代码(长整型);

q? filePos:在文件中发生错误的位置(长整型);

q? line:包含错误的代码行的行号(长整型);

q? linePos:在特定行中发生错误的位置(长整型);

q? reason: 错误的原因(字符串型);

q? srcText: 发生错误的代码行内容(字符串型);

q? url: XML文档的URL(字符串型)。


6,在IE中获取XML数据

要获取XML数据只需使用一个属性,即xml。该属性将对当前节点的XML数据进行序列化。序列化(serialization是将对象转换成简单的可存储或可传输格式的过程。xml属性将XML转换成字符串形式,包括完整的标签名称、属性和文本:

var sXml = oRoot.xml;

alert(sXml);

这段代码从文档元素开始序列化XML数据,并将其作为参数传递给alert()方法。下面就是部分已序列化的XML

<books><book isbn=”0471777781″>Professional Ajax</book></books>

已序列化的数据可以载入到另一个XML DOM对象,发送到服务器,或者传给另一个页面。通过xml属性返回的已序列化XML数据,取决于当前节点。如果是在documentElement节点使用xml属性,那么将返回整个文档的XML数据;如果只是在<book/>元素上使用它,那么将返回该<book/>元素所包含的XML数据。

xml属性是只读属性。如果希望往文档中添加元素,那么必须使用DOM方法来实现。