使用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代码。



var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") 'JAVASCRIPT中的创建对象 set objXml=CreateObject("Microsoft.XMLDOM") '创建解析器对象 objXml.async="false" objXml.load("test.xml") '装载xml文件 objXml.load(Server.MapPath("test.xml")) '根据绝对路径装载xml文件 Set objRootsite = xmlDoc.getElementsByTagName("NewList") '查找某一节点"NewList" objNextRootsiteName = xmlDoc.getElementsByTagName("NewList").item(0).nodeName Set objRootsite = objXml.documentElement.selectSingleNode("NewList") '查找某一节点"NewList" document.write(objRootsite.nodeName) '当前节点名称 objNextRootsite = objRootsite.childNodes.item(1) '查找"NewList"的第一子节点 objNextRootsiteText = objNextRootsite.childNodes.item(1).text '查找"NewList"的第一子节点的节点内容 xmlChildNode = objXml.documentElement.childNodes '获取当前节点 document.Write (xmlChildNode.nodename) '当前节点名称 document.write (xmlChildNode.text) '当前节点文本内容 frm.label.innerText = xmlChildNode.item(1).text '将Xml中的文本内容转换为Html中的内容 xmlChildNode.GetAttributeNode("name").Nodevalue '获取属性名为name的属性值 xmlChildNode.length 'xmlChildNode节点的子节点数量 '取出一个节点的属性集合 set objnodes=objXml.documentElement.SelectSingleNode("//people/man").GetAttributeNode("name").attributes for each element in objnodes response.write element.nodename '属性名 response.write element.nodevalue '属性值 next xmlDoc.getElementsByTagName("from").item(0).text xmlDoc.removeChild objRootsite '删除某个节点 objXml.parseError '错误接受容器 objXml.parseError.errorCode '返回长整型错误代码 objXml.parseError.reason '返回字符串型错误原因 objXml.parseError.line '返回长整型错误行号 objXml.parseError.linePos '返回长整型错误行字符位置 objXml.parseError.srcText '返回错误所在行的源代码 objXml.parseError.url '返回url装载文档指针---最近一份含有解析错误的XML文档的URL地址 objXml.parseError.filePos '返回长整型错误文件位置---在文档中的绝对字符位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值