用javascrip读XML在ie,firefox和chrome下的差异

javascript在各个浏览器下面的行为不一样的确是很让人头痛。最近做一个用到ajax的东西,有些问题困扰了我不少。所以在这里写一下希望遇到同样的问题的人能有帮助。

首先看看打开xml文档。

一.ie
1.读xml
ie下面打开xml文档的办法相对比较容易。
if (window.ActiveXObject)
{
    xmlDoc=newActiveXObject("Msxml2.DOMDocument");
    xmlDoc.async="false";
    xmlDoc.load("myxml.xml");
}
这个xml文件是同一个子目录。
这里面的window.ActiveXObject是ie特有的,在firefox下面是不能
xmlGet=newActiveXObject("Msxml2.DOMDocument");这样创建一个DOMDocument的。

2.查看错误
在读结点的内容前可以判断解析是不是出错:
if(xmlDoc.parseError.errorCode != 0)
{
    alert("XML Error: " +xmlDoc.parseError.errorCode.toString());
}
这里的错误代码都是很奇怪的数字,具体含义就不说了。

3.读结点内容
读结点的办法是Msxml2.DOMDocument提供的接口:
比如:
xml文档是这样的
<myroot>
<mynode>mytext</mynode>
</myroot>
var my_text =xmlDoc.documentElement.selectNodes("//mynode")(0).text;
xmlDoc.documentElement.selectNodes("//mynode")给出来的是xml中所有叫做mynode的结点的一个list。
这里比较有趣,因为(0)这样的list的用法在firefox下是不行的
ie中可以[0]或者(0)这样,而firefox只能[0]
不过无所谓了,反正这段代码是ie专用的。
具体细节就不多说了,反正这篇是专门讲ie,firefox,chrome的差异的。

二.firefox以及opera和其他
1.读xml
if (document.implementation &&document.implementation.createDocument)
{
    xmlDoc=document.implementation.createDocument("","", null);
    xmlDoc.async =false;
    xmlDoc.load("myxml.xml"); 
}
这里要注意的是xmlDoc.async =false;在ie中写成"false"和false好像是一样的,但是在firefox下面就必须是false。

2.查看错误
if (xmlDoc.documentElement.tagName == "parsererror")
{
    alert("XML Error.");
}
这里我没有试着打开错误的xml文档
据说在firefox中,如果发生错误,会生成这样的文档:
比如
<myroot>
<mynode>mytext</myroot>
这样的文档可能是:
<parsererrorxmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">
XML Parsing Error: mismatched tag. Expected:</mynode>
Location: http://yourwebsite......
Line Number 2, Column13:<sourcetext> <mynode>mytext------</myroot></sourcetext>
</parsererror>
这段文字换颜色是为了避免标签配对看上去不舒服

3.读取结点
createDocument得到的是一个XMLDocument
可以用
var my_text =xmlDoc.documentElement.getElementsByTagName_r("url_name")[0].childNodes[0].nodeValue;
这里说到childNods[0]
这个是很有趣的
firefox中比如<a>b</a>这种的结构,是有一个叫做#text(或者#textNode?)的结点的。
在html的解析也会这样。我自己没有试过,比如
<div><p></p><p></p><p></p></div>在firefox中div的childNodes的length是3
<div>
<p></p>
<p></p>
<p></p>
</div>
在firefox中第二个div的childNodes的length是7
是这样的:
<div> ------这里有一个#text结点,内容是一个换行符
<p></p> ------这里又有一个#text结点,内容是一个换行符
<p></p>...
ie中,第二个的div的childNodes的length依然是3,这一点是不一样的。
所以XML的DOM里,<a></a>是没有这个childNodes[0]的,需要用hasChildNodes()来判断一下。

三.Chrome
1.打开XML文档
if (document.implementation &&document.implementation.createDocument)
{
    xmlDoc=document.implementation.createDocument("","", null);
    xmlDoc.async =false;
    xmlDoc.load(../myxml.xml); 
}
这样在Chrome中是出错的,因为createDocument得到的是一个Document对象,是没有load函数的。
那怎么办呢?
http://code.google.com/p/chromium/issues/detail?id=988#c21中提供了一个workaround:
var xmlhttp = new window.XMLHttpRequest();
xmlhttp.open("GET", "myxml.xml", false);
xmlhttp.send(null);
xmlDoc = xmlhttp.responseXML.documentElement;

2.查看错误
好像只有查看XMLHttpRequest的错误了。
用XMLHttpRequest.statusText;吗?我也不大清楚。

3.读结点内容
这里和firefox一样可以用
var my_text =xmlDoc.getElementsByTagName_r("url_name")[0].childNodes[0].nodeValue;
这里的xmlhttp.responseXML相当于与上面的xmlDoc,这里取xmlDoc的时候已经取了documentElement,因为是直接取自我的程序我就不改了,免得测试不过写上错误的东西。

此外,在用XMLHttpRequest下载网页的行为上好像也和微软的不同,是firefox和chrome不能跨域下载东西吗?我得到的status总是0,而responseText是空的。不过后来换用php调用c++下载,然后我只需要下载本地的php就可以,就没遇到这个问题了。(因为很多大站下载不来的,用Msxml2.XMLHTTP也会有405not allowed 412 require denied 错误,所以索性换成c++去做了。)

http://blog.sina.com.cn/s/blog_4a5c75d40100lsyk.html

你可能感兴趣的:(用javascrip读XML在ie,firefox和chrome下的差异)