收藏本页 | 网站地图 | 投稿指南
 
 
当前位置:首页 >> 学院首页 >> 程序开发 >>

IE和火狐读取XML方法比较

放大字体  缩小字体  At: 2008-08-10 16:05  By: 年华 转载 来源: 互联网

一、IE读取XML
 var xmlDoc 
 xmlDoc = new ActiveXObject( "Msxml2.DOMDocument" );
 xmlDoc.loadXML(xml);

//取的节点
 var points = xmlDoc.documentElement.getElement yTagName(" oint");

//取得节点的内容值
 ointsIdea [I].childNodes[1].text

二、firefox读取XML

Firefox中创建一个XML DOM,需要调用< an style="font-size: 9.5pt">document.implementation对象的< an style="font-size: 9.5pt">createDocument()方法。该方法接受三个参数:第一个参数是包含文档所使用的命名空间URI的字符串;第二个参数是包含文档根元素名称的字符串;第三个参数是要创建的文档类型(也称为doctype)。如果要创建空的DOM文档,则代码如下所示:

var oXmlDom = document.implementation.createDocument(" quot;, " quot;, null);

前两个参数是空字符串,第三个参数为< an style="font-size: 9.5pt">null,这样可以确保生成一个彻底的空文档。事实上,现在Firefox中并不提供针对文档类型的JavaScript支持,所以第三个参数总是为< an style="font-size: 9.5pt">null。如果要创建包含文档元素的XML DOM,那么可以在第二个参数中指定标签名称:

var oXmlDom = document.implementation.createDocument(" quot;, " ook quot;, null);

这段代码创建了一个XML DOM,其< an style="font-size: 9.5pt">documentElement是< an style="font-size: 9.5pt">< ooks/>。如果要创建包含指定命名空间的DOM,可以在第一个参数中指定命名空间URI:

var oXmlDom = document.implementation.createDocument("http://www.site1.com",

  " ook quot;, null);

当在< an style="font-size: 9.5pt">createDocument()方法中指定命名空间时, Firefox会自动附上前缀< an style="font-size: 9.5pt">a0< an style="font-size: 9.5pt; font-family: 宋体">以表示命名空间URI:

<a0:books xml :a0="http://www.site1.com" />

接着,你可以通过程序来填充XML文档,不过在一般情况下,还需要在空的XML DOM对象中载入现有的XML文档。

1. 在Firefox中载入XML数据

在Firefox中,将XML载入XML DOM的方法和微软采用的方法大致相同,只存在一个显著区别:Firefox只支持< an style="font-size: 9.5pt">load()方法。因此,在这两种浏览器中载入外部XML数据的代码是相同的:

oXmlDom.load(" ooks.xml");

与微软的IE一样,Firefox同样实现了< an style="font-size: 9.5pt">async属性,该属性的行为也与其一致:将< an style="font-size: 9.5pt">async设置为< an style="font-size: 9.5pt">false,表示以同步模式载入文档;否则,以异步模式载入文档。

Firefox的XML DOM实现和微软的XML DOM实现还存在另一个不同,即Firefox不支持< an style="font-size: 9.5pt">readyState属性及< an style="font-size: 9.5pt">onreadystatechange事件处理函数。在Firefox中,支持< an style="font-size: 9.5pt">load事件和< an style="font-size: 9.5pt">onload事件处理函数。在文档完全载入后将触发< an style="font-size: 9.5pt">load事件:

oXmlDom.load(" ooks.xml");

oXmlDom.onload = function () {

  //文档完全载入后的操作

};

正如前面所说,在Firefox的XML DOM实现中,并没有< an style="font-size: 9.5pt">loadXML()方法,不过通过Firefox中的< an style="font-size: 9.5pt">DOMParser类可以模拟< an style="font-size: 9.5pt">loadXML()的行为。该类有一个名为< an style="font-size: 9.5pt">parseFromString()的方法,用来载入字符串并解析成文档:

var sXml = " lt;root> lt erso gt lt ame>Jeremy McPeak</name> lt;/perso gt lt;/root> quot 

var oParser = new DOMParser();

var oXmlDom = oParser.parseFromString(sXml,"text/xml");

在这段代码中,创建了一个XML字符串,并作为参数传递给< an style="font-size: 9.5pt">DOMParser的< an style="font-size: 9.5pt">parseFromString()方法。< an style="font-size: 9.5pt">parseFromString()方法的两个参数分别是XML字符串和数据的内容类型(一般设置为< an style="font-size: 9.5pt">text/xml)。< an style="font-size: 9.5pt">parseFromString()方法返回XML DOM对象,因此这里得到的< an style="font-size: 9.5pt">oXmlDom与第一个例子相同。

2. 在Firefox中获取XML数据

尽管存在这样那样的不同,但IE和Firefox中用于获取文档中XML数据的大多数属性和方法是一致的。正如在IE中,可以使用< an style="font-size: 9.5pt">documentElement属性来获取文档的根元素,例如:

var oRoot = oXmlDom.documentElement;

Firefox同样支持W3C标准属性,包括< an style="font-size: 9.5pt">childNodes、< an style="font-size: 9.5pt">firstChild、< an style="font-size: 9.5pt">lastChild、< an style="font-size: 9.5pt">nextSibling、< an style="font-size: 9.5pt">nodeName、< an style="font-size: 9.5pt">nodeType、< an style="font-size: 9.5pt">nodeValue、< an style="font-size: 9.5pt">ownerDocument、< an style="font-size: 9.5pt">parentNode和< an style="font-size: 9.5pt">previou ibling。不幸的是,对于微软专有的< an style="font-size: 9.5pt">text和< an style="font-size: 9.5pt">xml属性,Firefox并不支持,不过可以利用其他方法来模拟该属性的行为。

大家应该还记得,< an style="font-size: 9.5pt">text属性返回了当前节点的内容,或者是当前节点及其子节点的内容。这不仅仅返回当前节点的文本,还有所有子节点的文本,因此要模拟该功能实现是十分容易的。下面这个简单的函数就能够完成该功能,该函数唯一的参数是一个节点:

function getText(oNode) {

  var sText = " quot 

  for (var i = 0; i < oNode.childNodes.length; i++) {

  if (oNode.childNodesIdea [I].hasChildNodes()) {

  sText += getText(oNode.childNodesIdea [I]);

  } else {

  sText += oNode.childNodesIdea [I].nodeValue;

  }

  }

  return sText;

}

在< an style="font-size: 9.5pt; letter- acing: 0pt">getText()函数中,< an style="font-size: 9.5pt; letter- acing: 0pt">sText变量用来保存获取的所有文本。接着对< an style="font-size: 9.5pt; letter- acing: 0pt">oNode的子节点使用< an style="font-size: 9.5pt; letter- acing: 0pt">for< an style="font-size: 9.5pt; font-family: 宋体; letter- acing: 0pt">循环进行遍历,检查每个子节点是否包含子节点。如果有子节点,那么就将其< an style="font-size: 9.5pt; letter- acing: 0pt">childNode传给< an style="font-size: 9.5pt; letter- acing: 0pt">getText()函数,并进行同样的处理;如果没有子节点,那么将当前节点的< an style="font-size: 9.5pt; letter- acing: 0pt">nodeValue加到字符串中(对文本节点而言,这只是文本字符串)。处理了所有子节点后,该函数返回变量< an style="font-size: 9.5pt; letter- acing: 0pt">sText

IE中的< an style="font-size: 9.5pt">xml属性将存放对当前节点包含的所有XML进行序列化的结果。在Firefox中,提供了一个名为< an style="font-size: 9.5pt">XMLSerializer对象来完成这一功能。该对象提供一个使用JavaScript可访问的< an style="font-size: 9.5pt">serializeToString()方法,使用该方法可以对XML数据进行序列化。

function serializeXml(oNode) {

  var oSerializer = new XMLSerializer();

  return oSerializer.serializeToString(oNode);

}

< an style="font-size: 9.5pt">serializeXml()函数以XML节点作为参数,创建一个< an style="font-size: 9.5pt">XMLSerializer对象,并将该节点传给< an style="font-size: 9.5pt">serializeToString()方法。该方法将向调用者返回XML数据的字符串表示。

< an style="font-family: 楷体_GB2312">对于节点操作的DOM< an style="font-family: 楷体_GB2312">方法,Firefox< an style="font-family: 楷体_GB2312">与IE< an style="font-family: 楷体_GB2312">大致相同。参见“在IE< an style="font-family: 楷体_GB2312">中操作DOM< an style="font-family: 楷体_GB2312">”小节。

3. 在Firefox中处理错误

Firefox与IE的错误处理并不一样。当IE遇到错误时,它会填充< an style="font-size: 9.5pt">parseError对象;而当Firefox遇到错误时,它会将包含错误信息的XML文档载入到XML DOM文档中。看下面的这个例子:

var sXml = " lt;root> lt erso gt lt ame>Jeremy McPeak</name> lt;/root> quot 

var oParser = new DOMParser();

var oXmlDom = oParser.parseFromString(sXml,"text/xml");

 

if (oXmlDom.documentElement.tagName != " arsererror") {

  //没有错误发生,进行所需操作

} else {

  alert("An Error Occurred");

}

在突出显示的代码行中,你会发现其中将产生一个错误:XML字符串格式不正确(因为< an style="font-size: 9.5pt">< erso gt;元素不完整,没有相应的< an style="font-size: 9.5pt"></perso gt;元素)。当载入错误的XML时,XML DOM对象将会载入一个< an style="font-size: 9.5pt">documentElement为< an style="font-size: 9.5pt">< arsererror/>的错误文档。我们可以通过检查< an style="font-size: 9.5pt">documentElement的< an style="font-size: 9.5pt">tagName属性来很容易地确定是否发生错误。如果< an style="font-size: 9.5pt">tagName属性不是< an style="font-size: 9.5pt">parsererror,就可以确定没有发生任何错误。

在本例中,可能会生成如下所示的错误文档:

< arsererror xml ="http://www.mozilla.org/newlayout/xml/parsererror.xml" gt;XML

Parsing Error: mismatched tag. Expected: </perso gt;.

Location: http://yoda/fooreader/test.htm

Line Number 1, Column 43:< ourcetext> lt;root> lt erso gt lt ame>Jeremy

McPeak</name> lt;/root>

------------------------------------------^</sourcetext> lt;/parsererror>

所有的错误信息都包含在错误文档的文本中。如果要通过程序使用这些错误信息,那么首先就要对其进行解析。最简单的方法是使用一个稍长的正则表达式:

var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column

  (\d+):< ourcetext>([\s\S]*?)(?:\-*\^)/;

该正则表达式将错误文档分为五个部分:错误消息、发生错误的文件名、行号、该行中发生错误的位置,以及发生错误的源代码。使用正则表达式对象的< an style="font-size: 9.5pt">test()方法可以使用这些信息:

if (oXmlDom.firstChild.tagName != " arsererror") {

  //没有错误发生,进行所需操作

} else {

  var oXmlSerializer = new XMLSerializer();

  var sXmlError = oXmlSerializer.serializeToString(oXmlDom);

  var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column

  (\d+):< ourcetext>([\s\S]*?)(?:\-*\^)/;

  reError.test(sXmlError);

正则表达式捕获到的第一部分数据是错误消息,第二部分是文件名,第三部分是行号,第四部分是行内位置,第五部分是源码。你可以使用这些解析后的信息来创建自定义的错误消息:

var str = "An error occurred!! " +

  "Description: " + RegExp.$1 + " " +

  "File: " + RegExp.$2 + " " +

  "Line: " + RegExp.$3 + " " +

  "Line Position: " + RegExp.$4 + " " +

  " ource Code: " + RegExp.$5;

alert(str);

如果发生错误,那么< an style="font-size: 9.5pt">alert()方法会以易于阅读的格式在警告框中来显示相关的错误信息。

 






         









 
Google
论坛精华  
 
 
  ©2005-2008 站长吧 Master8.NET All Rights Reserved 陕ICP备05010609号