此项技术同时应用于Web服务器端和客户端,而不仅仅像过去那样只在Web服务器端才提供XML功能
IE中的XML DOM使用方法
1,创建
var oXmlDom = new ActiveXObject(“Microsoft.XmlDom”);
同XMLHttp有多个一样, XMLDOM也有多个版本,
Microsoft.XmlDom;
MSXML2.DOMDocument;
MSXML2.DOMDocument.3.0;
MSXML2.DOMDocument.4.0;
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,结点操作
创建节点
使用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()方法添加由其参数指定的新元素,并且将其作为最后一个子节点
删除、替换和插入节点
删除
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对象提供了以下属性,
errorCode:错误代码(长整型);
filePos:在文件中发生错误的位置(长整型);
line:包含错误的代码行的行号(长整型);
linePos:在特定行中发生错误的位置(长整型);
reason: 错误的原因(字符串型);
srcText: 发生错误的代码行内容(字符串型);
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方法来实现。