varcurrentNode=xml.childNodes[loopIndex];
if(currentNode.nodeType==1){
removeBlank(currentNode);
}
if(((/^\s+$/.test(currentNode.nodeValue)))&&(currentNode.nodeType==3)){
xml.removeChild(xml.childNodes[loopIndex--]);
}
}}
}
在Javascript中,一段正则表达式被放在两个”/”之间,通过/s$/.test(str)这样的语句就可以判断str中是否包含”s$”代表的正则表达式,如果包含则返回true。
/^\s+$/这个正则表达式的作用是判断字串的每一行中是否从开头到结尾包含一个或多个空格
getElementById方法在解析XML的时候是否适合呢?
首先XML中每一个元素节点不一定有id属性
其次XML中的两个元素节点可能有相同的id属性,这样getElementById这个方法就不再能保证找到我们需要的唯一节点了
因此这种方式并不适合XML的解析。
XPATH是什么?
全称是XMLPathLanguage(XML路径语言),适用于确定XML文档中某节点位置的语言。
我们可以把它当作类似于SQL一样的查询语言,通过给出XPTAH路径信息(就像SQL命令一样)就可以从XML中查找出符合条件的节点(就像从数据库中返回需要的数据一样)。
使用过DOM4j的人可能都知道可以利用其中的selectSingleNode和selectNodes方法直接给出XPATH地址来获取任意深度的一个或多个节点。
在IE6.0及其以后版本中我们可以使用同样的方式来访问任意深度的XML数据,这给XML数据的解析操作带来了便利。
但是在FireFox等浏览器中,则是使用了w3c标准的XPATH处理方式,没有IE这么简单的方式。
Wang
AJAXProfessional
35
Lee
AJAXInAction
65
Zhu
AJAXForDummies
40
(1)所有的author节点
(2)获取所有isdn属性节点
(3)获取所有name节点中的文本内容
(4)有isdn属性的book节点
(5)获得子节点price值大于35且isdn等于0002的所有book节点
(6)获得子节点price值大于35或isdn等于0002的所有book节点
如果当前节点是根节点:
“book/author”
不管当前节点是什么都可以用:
”/books/book/author”或”//author”或”//book/author”
XPATH的路径即可以是相对路径,也可以是绝对路径。
当以”/”开头,则表示绝对路径方式,从根节点开始查找
如果不以”/”开头,则表示相对路径,这个时候相对的是我们前面的封装函数中的第一个参数所表示的节点对象。
注意,如果当前节点是某一个book节点,我们只能通过”author”找到这个book节点下的author节点。
如果以”//”开头,则直接找整个文档中符合条件的节点,不管这个节点在哪里,找到所有的author节点。
如果当前节点是根节点:
“book/@isdn”
不管当前节点是什么都可以用:
”/books/book/@isdn”或”//@isdn”或”//book/@isdn”
获取属性节点和获取元素节点在路径表示上是一样的,即可以用相对路径,也可以用绝对路径,还可以用”//”查找任意满足的节点。
不同之处是对于元素节点,直接用节点标签名表示,而属性节点则用@加上属性名来表示。
如果当前节点是根节点:
“book/name/text()”
不管当前节点是什么都可以用:
”/books/book/name/text()”或”//name/text()”或”//book/name/text()”
获取文本节点和前面两个在路径表示上也是一样的。
不同之处在于需要使用text()方法
如果当前节点是根节点:
“book[@isdn]”
不管当前节点是什么都可以用:
”/books/book[@isdn]”或”//book[@isdn]”如果当前节点是根节点:
“book[@isdn=’0002’][price>35]”
不管当前节点是什么都可以用:
”/books/book[@isdn=’0002’][price>40]”或”//book[@isdn=’0002’][price>40]”
在XPATH中可以在[]中指定条件,从而只获得满足某些条件的节点
比如需求(4)中我们期望获得包含isdn属性的book节点,就可以用[@isdn]来表示
对于需求(5),我们期望isdn属性是0002,而且book的price子节点的值大于40,对于前一个条件,可以使用[@isdn=’0002’],对于后一个条件可以使用[price>40],要同时满足两个条件,只要把这两个都写上就可以了。
如果当前节点是根节点:
“book[@isdn=’0002’]|book[price>35]”
不管当前节点是什么都可以用:
”/books/book[@isdn=’0002’]|/books/book[price>35]”或”//book[@isdn=’0002’]|//book[price>35]”
和(5)的需求不同之处是我们需要的不是与关系,而是或关系,这个时候我们可以使用”|”表示或关系,”|”可以同时连接多个XPATH路径。
这里需要注意的是这样返回的节点数组是不会有重复信息的,例如我们这个例子中price>35的节点有两个,其中一个满足isdn=’0002’这个条件,最后的返回结果中只有两个节点,而不会有三个节点。
DOM除了可以解析和修改XML以外,还可以从字符串或xml文件中加载XML,或者新建一个空的XML
XML的加载和上一节XPATH面临的问题一样,IE和FireFox中处理方式差异很大,因此为了使用方便,我们进行了封装
在IE的装载过程中,仍然使用了ActiveX对象来做工作
在IE中,新建了对象以后还需要设置使用同步方式装载文档,这和我们使用XMLHttpRequest的方式不同,当然如果你需要,也可以异步的装载文档,这个时候就需要像XMLHttpRequest对象一样设置onreadystatechange属性了。
IE中装载XML的对象提供了两个方法分别用于装载XML文件和包含XML的字符串。
最后我们返回的是XML文档的根元素节点。
如果在实际应用中需要返回根节点,只要将return的内容从xmlDoc.documentElement变成xmlDoc就可以了。
在FireFox的装载过程中,装载XML文件和装载XML字符串是不一样的。
如果需要装载XML文件,应该首先通过document.implementation.createDocument建立一个空文档,然后调用文档对象的load方法来装载。
而如果要装载XML字符串,则是需要建立一个DOMParser的对象,然后通过parseFromString方法进行装载,返回文档对象。
需要注意的是在FireFox中,只有装载XML文件才会需要设置同步方式装载文档,如果需要像XMLHttpRequest一样异步处理,就需要设置onload属性,而且FireFox中处理装载完成的情况和IE也不一样,不是XMLHttpRequest的那种需要判断readyState的方式,而是直接会执行onload属性对应的方法中的内容。
最后还有一点要说明的是,在IE和FireFox中装载XML文件时,会有和XMLHttpRequest对象一样的安全性限制,也就是不能访问跨域的XML数据。
由于通常情况下不会装载跨域的XML数据,因此这个问题不是很麻烦,如果却是有需要装载跨域XML数据,那么可以考虑使用前面解决XMLHttpReuqest对象跨域问题的思路来解决这个问题。
展开阅读全文
相关搜索