JS操作XML文件实现IE与Firefox兼容的方法

作者:函数茶馆时间:2026-10-30 09:43:30浏览:484

本文介绍如何在JavaScript中读取XML文件并实现IE与Firefox浏览器的兼容。通过封装loadXml函数,利用ActiveXObject和document.implementation.createDocument分别处理IE和Firefox,解决跨浏览器XML加载问题。同时指出Firefox解析XML时节点文本获取需使用textContent,并处理childNodes中可能存在的换行符干扰。

项目背景与需求分析

在最近的项目开发中,涉及到了XML数据的使用。具体需求是在用户安装产品时,先将一系列配置数据保存至XML文件中,直到执行到最后一步时才将这些数据写入数据库。这种设计旨在最大限度地减少对数据库的直接访问频率。然而,这一过程引发了对各浏览器兼容性的关注,特别是IE与Firefox之间的差异处理。

接下来进入具体实现部分,参考示例XML文件(如createInstal.xml)的结构。


<?xml version="1.0" encoding="utf-8"?>
<info>
<Item>
<id descrption="级别" name="1" f_chines="编号" t_chines="編號" english="id" value="1">编号</id>
<levelname descrption="级别" name="" f_chines="级别名称" t_chines="級別名稱" english="Level-Name" value="级别一">级别名称</levelname>
<decrption descrption="级别" name="" f_chines="级别描述" t_chines="級別描述" english="Level-Description" value="级别描述一">描述</decrption>
<Tchines descrption="级别" name="" f_chines="繁体中文" t_chines="繁體中文" english="T-Chinese" value="級別一">繁体中文</Tchines>
<english descrption="级别" name="" f_chines="英文名称" t_chines="英文名稱" english="English" value="LevelOne">英文名称</english>
<奖项六 descrption="奖项" name="106" f_chines="奖项六" t_chines="獎項六" english="Worda-of-t" value="a"/>
<奖项十一 descrption="奖项" name="111" f_chines="奖项十一" t_chines="獎項十一" english="11" value="0.05"/>
<奖项十二 descrption="奖项" name="112" f_chines="奖项十二" t_chines="獎項十二" english="2222" value="0.04"/>
<奖项十三 descrption="奖项" name="113" f_chines="奖项十三" t_chines="獎項十三" english="3333" value="0.85"/>
<奖项一 descrption="奖项" name="101" f_chines="奖项一" t_chines="獎項一" english="Aword-of-a" value="0.90"/>
</Item> 
</info>

IE与Firefox兼容实现方案

为了实现IE与Firefox的兼容,需要编写特定的JavaScript函数(例如loadxml.js)。


var is_Ie =false; //是否为IE浏览器
if (window.ActiveXObject) {
is_Ie =true;
}
//加载多浏览器兼容的xml文档
function loadXml(xmlUrl) {
var xmldoc =null;
try {
xmldoc =new ActiveXObject("Microsoft.XMLDOM");
}
catch (e) {
try {
xmldoc = document.implementation.createDocument("", "", null);
} catch (e) {
alert(e.message);
}
}
try {
//关闭异步加载
xmldoc.async =false;
xmldoc.load(xmlUrl);
return xmldoc;
}
catch (e) {
alert(e.message);
}
returnnull;
}
//将一个xml文档格式的字符串换成xml文档
function createXml(xmlText) {
if (!xmlText) {
returnnull;
try {
var xmldocm =new ActiveXObject("Microsoft.XMLDOM");
xmldocm.loadXML(xmlText);
return xmldocm;
}
catch (e) {
try {
returnnew DOMParse().parseFromString(xmlText, "text/xml");
}
catch (e) {
returnnull;
}
}
}
}
//获取节点及其子节点的文本
function getXmlText(oNode) {
if (oNode.text) {//IE
return oNode.tex;
}
var sText ="";
for (var i =0; i < oNode.childNodes.length; i++) { //遍历子节点
if (oNode.childNodes[i].hasChildNodes()) { //是否有子节点
sText += getXmlText(oNode.childNodes[i]);
} else {
sText += oNode[i].childNodes.nodeValue;
}
}
return sText;
}

//获取节点及其子节点的字符串标识
function getXml(oNode) {
if (oNode.xml) {//IE
return oNode.xml;
}
var serializer =new XMLSerializer();
return serializer.serializeToString(oNode);

}
//获取指定节点的文本(注意:也可以用oNode.childNodes[0].nodeValue来获取节点的文本信息,这样就不用考虑浏览器的问题了oNodeoNode)
function getxmlnodeText(oNode) {
if (is_Ie) {
return oNode.text;
} else {
if (oNode.nodeType ==1)
return oNode.textContent;
}
}
//获取指定节点的属性值
function getxmlnodeattribute(oNode, attrName) {
if (is_Ie) {
return oNode.getAttribute(attrName);
} else {
if (oNode.nodeType ==1|| oNode.nodeType =="1")return oNode.attributes[attrName].value;return"undefined";}}

通过以下具体操作步骤,可以解决IE与Firefox之间的兼容性问题。


var docum = loadxml("createInstal.xml");//加载一个xml文件

var root = docum.documentElement;//根节点

var nodelist = root.getElementsByTagName("Items");

for(var i=0;i<nodelist[0].childNodes.length;i++)

{

  var attr = getxmlnodeattribute(nodeList[0].childNodes[i], "descrption");//获取这个节点的descrption属性

  if(attr != "undefined")//目的是兼容FF浏览器

  {

    alert(attr);

  }

}

上述方法能够保证IE与Firefox的兼容性。需要注意的是,目前该方法在谷歌浏览器中尚未完全兼容,仍需进一步修改适配。

Firefox中XML获取方法详解

此外,这里补充说明在Firefox中获取XML数据的两种主要方式。

关于在Firefox中使用JavaScript读取XML文件的讨论。

网络上搜索“firefox中JS读取XML文件”的相关资料时,发现许多问题缺乏有效解答。不少开发者对Firefox表示抱怨,认为其增加了开发难度。回到技术本身,Firefox不支持IE中使用的ActiveXObject对象,因此获取XML DOM对象需要采用其他两种方法。

这两种方法分别是:1、使用document.implementation.createDocument("", "", null);2、使用window.XMLHttpRequest。

示例1:var dom=document.implementation.createDocument("", "", null);

设置dom.async=false; 然后执行dom.load("test.xml");此时,dom即为XML对象。

示例2:var oXmlHttp = new XMLHttpRequest(); 执行oXmlHttp.open( "GET", "test.xml", false ); 接着oXmlHttp.send(null); 此时,oXmlHttp.responseXML即为XML对象。

Firefox解析XML注意事项

需要注意以下几点事项:

首先,涉及火狐浏览器对XML文档的解析机制。

其次,Firefox和IE在解析XML时存在差异,获取节点值时应使用textContent属性。

3、并且他会在有的层次child节点(即使用childNodes时)前后都加上"\n"换行符。(这个搞不清楚为什么,用firebug调试的时候就是这个样子,所以写过的代码最好测试一下,换个环境就不对了) ,也就是说第1个节点是"\n",第2个节点才是真正的

具体来说,第1个节点可能是"\n",而第2个节点才是实际的第一个数据节点;第3个节点可能是"\n",第4个节点才是实际的第二个数据节点。

基于上述Firefox的特性,这里提供一个避免直接使用childNodes的示例,以实现更好的兼容性:点击进入查看详细代码。

以上就是小编为大家带来的js操作XML文件的实现方法兼容IE与FireFox全部内容了,希望大家多多支持本站~

作者最新文章