您的位置:首页 > 编程语言 > Java开发

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

2013-11-04 15:48 375 查看
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++去做了。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐