`

使用Javascript操作XML

阅读更多

摘自:http://book.51cto.com/art/200805/72969.htm

 

11.2  使用Javascript操作XML

11.2.1  MSXML介绍

在IE中,微软提供了MSXML控件来支持XML操作。每个系统安装的MSXML版本都有可能不同,因此在编写程序的时候要注意版本的确定。目前MSXML从旧到新有以下几个版本。

• Microsoft.XmlDom (最初的版本)

• MSXML2.DOMDocument

• MSXML2.DOMDocument.3.0

• MSXML2.DOMDocument.4.0

• MSXML2.DOMDocument.5.0

下面的函数用来获取一个系统中可用的最新版本的DomDocument对象,若都不存在,则返回空,代码如下:

function createDomDoc()
{
var signatures=["Msxml2.DOMDocument.5.0",
"Msxml2.DOMDocument.4.0",
"Msxml2.DOMDocument.3.0",
"Msxml2.DOMDocument",
"Microsoft.XmlDom"];
for(var i=0;i<signatures.length;i++)
{
try{
var domDoc = new ActiveXObject(signatures[i]);
return domDoc;
} catch(e) {
//忽略错误,继续循环尝试下一个版本
}
}
return null;
}

 

11.2.2  在IE浏览器中创建XML片段

下面介绍如何通过DomDocument对象创建一个XML片段,以11.1.3节中的XML片段为例。下面是代码,返回的则是XML文本。

function createXml(doc)
{
var root = doc.createElement("items");
var title = doc.createElement("title");
title.text = '标题';
root.appendChild(title);    //添加title子结点
for(var i=0;i<3;i++)
{
var item = doc.createElement("item");
item.text = '条目'+i;
root.appendChild(item);   //添加item子结点
}
doc.appendChild(root);    //设置root结点
return doc.xml;
}

在这段代码中,createElement方法用来建立一个新的元素结点,参数是这个结点标记的名称。结点的text属性可以用来设置其内容(严格说,就是设置其文本子结点的内容)。

appendChild方法可以在某个元素结点下添加子结点。在创建XML片段的时候,需要使用该方法将构建好的XML附加到DomDocument对象上。XML属性则可以将DomDocument序列化,使其成为一段文本。

在程序中加入下列执行代码:

var domDoc = createDomDoc();
if(domDoc!=null)
{
var xml=createXml(domDoc);
alert(xml);
}
else
{
alert('未安装MSXML控件');
}

运行结果如图11.3所示。

图11.3  通过XML DOM对象创建的XML文本

 

11.2.3  在IE浏览器中解析XML文本

下面介绍如何通过DomDocument对象来解析已有的XML文本。在IE中有2种导入XML文本的办法。一种是通过load方法,其语法代码如下。

domDoc.load("test.xml"); //导入test.xml文件中的内容

该方法只能导入JavaScript所在的本地文件,而不支持远程导入。

第二种方法是通过loadXML方法直接导入,代码是:

xml = "";
domDoc.loadXML(xml); //直接解析xml中包含的XML文本

另外,由于解析XML有时会花费较长的时间,MSXML还提供了异步机制,代码如下:

domDoc.async = true; //异步调用
domDoc.onreadystatechange = function ()  //触发函数
{
if(domDoc.readyState==4) {
doc = domDoc;
document.write("

");
var root = doc.documentElement;
document.write(""+root.childNodes.item(0).text+"");
for(var i=1;i<root.childnodes.length;i++)
{
node = root.childNodes.item(i);
document.write(""+node.text+"");
}
document.write("

");
}
};
domDoc.loadXML(xml);

 

通过这段代码可以看出:设置DomDocument的async属性可以进行异步解析;childNodes属性含有一个包含所有子结点的列表,可以通过childNodes.item(i)来获取索引值为i的子结点;通过childNodes的length属性可以获得子结点的个数;结点的text属性则可以用来获取某个元素结点的内容(或者说是其文本子结点的内容)。

另外,触发函数中的readyState取值有其特定的含义。

• 1:表示正在载入,还没开始解析;

• 2:表示数据已经载入完毕,开始解析,但是DOM仍不可用;

• 3:表示一些数据已经解析完成,DOM已经可以使用,但还不完整,只包含已解析部分的数据。另外,此时的DOM是只读的;

• 4:表示数据解析已经全部完成,DOM已经可以正常使用。

运行这段代码,将会得到如图11.4所示的效果。

通过运行的结果可以看出,触发函数生成的实际上就是本章最开始给出的HTML代码。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics