一聚教程网:一个值得你收藏的教程网站

热门教程

Javascript中XML文档的查询与加载

时间:2022-06-25 16:48:02 编辑:袖梨 来源:一聚教程网

 Document 定义的方法大多数是生产型方法,主要用于创建可以插入文档中的各种类型的节点。常用的 Document 方法有:

方法

描述

createAttribute()

用指定的名字创建新的 Attr 节点。

createComment()

用指定的字符串创建新的 Comment 节点。

createElement()

用指定的标记名创建新的 Element 节点。

createTextNode()

用指定的文本创建新的 TextNode 节点。

getElementById()

返回文档中具有指定 id 属性的 Element 节点。

getElementsByTagName()

返回文档中具有指定标记名的所有 Element 节点。

 加载

通过XML DOM对象就可以载入一些XML了。微软的XML DOM有两种载入XML的方法:loadXML()与load()。

loadXML()方法可直接向XML DOM输入XML字符串:

 代码如下 复制代码

oXmlDom.loadXML('');

load()方法用于从服务器上载入XML文件。不过,load()方法只可以载入包含JavaScript的页面存储于同一服务器上的文件 ,也就是说,不可以通过其他人的服务器载入XML文件。

还有两种载入文件的模式:同步与异步。以同步模式载入文件时,JavaScript代码会等待文件完全载入后才继续执行代码;而以异步模式载入时,不会等待,可以使用事件处理函数来判断文件是否完全载入了 。

默认情况下,文件是按照异步模式载入的,要进行同步载入,只需设置async属性为false :

Js代码 
1.

 代码如下 复制代码
oXmlDom.async = false; 
oXmlDom.async = false;

然后使用load()方法,并给出要载入的文件名:

Js代码 
1.

 代码如下 复制代码
oXmlDom.load('test.xml'); 
oXmlDom.load('test.xml');

执行这一行代码后,oXmlDom会包含能表示XML文件结构的一个DOM文档,这样就可以使用DOM所有的属性与方法了。

 
异步载入文件时,要使用readyState属性和onreadystatechange事件处理函数:

readyState属性有一种上可能的值:

•0——DOM尚未初始化任何信息
•1——DOM正在载入数据
•2——DOM完成了数据载入
•3——DOM已经可用,不过某些部分可能还不能用
•4——DOM已经完全载入,可以使用了
一旦readyState属性的值发生变化,就会触发readystatechange事件,如果使用onreadystatechange事件处理函数,就可以在DOM完全载入时,发出通知,必须在调用load()方法前分配好onreadystatechange事件处理函数,如:

Js代码 

 代码如下 复制代码
oXmlDom.onreadystatechange = function () {  
   if (oXmlDom.readyState == 4) {  
           alert('done');  
    }  
};  
oXmlDom.load("test.xml"); 
oXmlDom.onreadystatechange = function () {
 if (oXmlDom.readyState == 4) {
           alert('done');
 }
};
oXmlDom.load("test.xml");

注:事件处理函数代码中要使用oXmlDom而不是this关键字。这是ActiveX对象特殊之处:使用this关键词可能会出现不可预测的错误。

无论是同步还是异步地载入文件,load()方法都可能接受部分的,相对的或者完整的XML文件路径,如下:

 代码如下 复制代码

oXmlDom.load('test.xml');

oXmlDom.load('../test.xml');

oXmlDom.load('http://www.mydomanin.com/test.xml');

 查询

对XML的元素、属性、文本的查询可以使用XPath。具体的定义可以参看w3school。

首先应该了解一下XPath表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

我们主要使用两个方法来查询XML文档,selectNodes(xpath expression)和selectSingleNode(xpath expression)。

selectNodes返回一个NodeList对象,也就是所有符合xpath表达式的xml节点都将会被返回,你需要对返回的结果进行遍历。

selectSingleNode只返回第一个符合xpath表达式的节点,或者返回null。

下面举几个例子:

 1. 返回所有Contact节点:

 代码如下 复制代码

var nodelist = xmlDoc.selectNodes("/Customers/Customer/Contact");
for (var i = 0; i < nodelist.length; i++) {
    alert(nodelist[i].xml);
}

返回的结果为:

Li Li
Aaron Babbitt
Daisy Cabell
Gabriel Eads

 

2. 返回id为02的customer:

 代码如下 复制代码
xmlDoc.selectSingleNode("/Customers/Customer[@id='02']")     

      

返回结果为:

<

 代码如下 复制代码

Customer id="02" city="Amsterdam" country="The Netherlands" name="Shell">

    Aaron Babbitt

    Daisy Cabell

    Gabriel Eads

 

3. 返回含有contact名为Li Li的contact:

 代码如下 复制代码

xmlDoc.selectSingleNode("/Customers/Customer/Contact[text()='Li Li']")

返回结果为:

 代码如下 复制代码

Li Li

 4. 返回含有contact名为 Li Li 的customer。注意和3的区别:

 代码如下 复制代码

xmlDoc.selectSingleNode("/Customers/Customer[Contact/text()='Li Li']");

    Li Li

5. 如何获取xml、text、以及属性(attribute)

(1) 获取xml: 使用.xml,比如

 代码如下 复制代码
xmlDoc.selectSingleNode("/Customers/Customer/Contact[text()='Li Li']").xml

结果为:

 代码如下 复制代码
Li Li

(2) 获取

 代码如下 复制代码
text:xmlDoc.selectSingleNode("/Customers/Customer/Contact[text()='Li Li']").text

结果为: Li Li

(3) 获取属性使用 getAttribute 方法: 

 代码如下 复制代码
xmlDoc.selectSingleNode("/Customers/Customer/Contact[text()='Li Li']").getAttribute(“gender”)

最后看一个完整的实例

 代码如下 复制代码

< script language = " JavaScript " >
 
 

热门栏目