我正在设计一个客户端脚本,它将读取XML文件并显示它,如下所示:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
function loadXML(xmlFile) {
xmlDoc.async = "false";
xmlDoc.onreadystatechange = verify;
xmlDoc.load(xmlFile);
}
function verify() {
if(xmlDoc.readyState != 4) {
return false;
}
}
function traverse(tree) {
if(tree.hasChildNodes()) {
document.write('<ul><li>');
document.write('<b>' + tree.tagName + ': </b>');
var nodes = tree.childNodes.length;
for(var i = 0; i < tree.childNodes.length; i++) {
traverse(tree.childNodes(i));
}
document.write('</il></ul>');
} else {
document.write(tree.text);
}
}
function initTraverse(file) {
loadXML(file);
var doc = xmlDoc.documentElement;
traverse(doc);
}
当我解雇Safari时,我看到没有显示任何内容,然后我打开了错误控制台,我得到的是:
ReferenceError:找不到变量:ActiveXObject
我该怎么做才能使这项工作?
PS:我希望这个页面能够在Mobile Safari上运行
答案 0 :(得分:5)
ActiveXObject在Internet Explorer之外无效。
有一些替代的xml解析器和处理程序,如E4X。虽然E4X目前只在firefox中完成(https://developer.mozilla.org/En/E4X/Processing_XML_with_E4X)。
如果使用jQuery是一个选项,那么你可以查看marcgrabanski.com/articles/jquery-makes-parsing-xml-easy
答案 1 :(得分:4)
那里有一些有趣的东西。最有趣的是async = false
行。你可能想重新考虑那一点。要更改为异步请求,您必须重新编写其他代码并删除document.write
次调用。
无论如何,这是一个(未经测试但有希望)替代使用XMLHttpRequest而不是xml文档的内容。
var xmlDoc = null;
function loadXML(xmlFile) {
var request = new XMLHttpRequest();
request.open('GET', xmlFile, false); // false is synchronous
request.send();
xmlDoc = request.responseXML;
}
您可能需要进行一些调试......
答案 2 :(得分:0)
您应该具有与DOMParser或DOMDocument兼容的跨浏览器。当然,我不确定您是否要解析XML URL或XML字符串。对于XML URL,我建议:
if (window.XMLHttpRequest) return new window.XMLHttpRequest();
else if (window.ActiveXObject) {
// the many versions of IE's XML fetchers
var AXOs = [
'MSXML2.XMLHTTP.6.0',
'MSXML2.XMLHTTP.5.0',
'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP',
'MSXML.XMLHTTP'
];
for (var i = 0; i < AXOs.length; i++) {
try { return new ActiveXObject(AXOs[i]); }
catch() { continue; }
}
return null;
}
对于XML字符串,此代码块可以更好地工作:
if (window.DOMParser) return (new DOMParser()).parseFromString(str, 'text/xml');
else if (window.ActiveXObject) {
var doc;
// the many versions of IE's DOM parsers
var AXOs = [
'MSXML2.DOMDocument.6.0',
'MSXML2.DOMDocument.5.0',
'MSXML2.DOMDocument.4.0',
'MSXML2.DOMDocument.3.0',
'MSXML2.DOMDocument',
'Microsoft.XMLDOM',
'MSXML.DOMDocument'
];
for (var i = 0; i < AXOs.length; i++) {
try { doc = new ActiveXObject(AXOs[i]); break; }
catch() { continue; }
}
if (!doc) return createElement('div', null);
if (doc.async) doc.async = false;
doc.loadXML(str);
return doc;
}
return createElement('div', null);
DOMDocument对象支持从URL加载XML的load()方法,但它的语法与XMLHttpRequest和XMLHTTP方法不同。
DOMDocument出现(至少从MSDN文档中)也包含XMLHTTP方法,因此您可以在AXO数组中交错DOMDocument,但我不确定。另外,我无法想象DOMDocument在没有XMLHTTP的情况下就位。