JS 对 XML 文件与 XML 字符串的解析
本文摘自 勾三股四 更早时期的 不老歌 博客。
最近在协助某神秘的“有关部门”调试一个神秘的 B/S 系统,发现其中有一段代码是对 XML 数据进行解析的,XML 数据来源可能是字符串,也可能是一个 XML 文件。在原来的系统中,这一部分的实现方式是 IE only 的,即使用 ActiveX 对象,实现 load/loadXML 的方法。所以现在要解决的问题之一,就是使这一段代码可以在IE以外的浏览器环境中正常运行。
后来发现了 DOMParser 这个东东,可以在 IE 以外的环境中对 XML 字符串进行解析处理,问题解决了一半:
function loadXml(xml) {
var doc, parser;
if (typeof ActiveXObject != 'undefined') {
parser = new ActiveXObject ("MSXML2.DOMDocument");
parser.async = false;
var flag = parser.loadXML(xml);
doc = parser.documentElement;
}
else {
parser = new DOMParser();
doc = parser.parseFromString(xml, "text/xml");
doc = trim(doc);
}
return doc;
}对于读取 XML 文件,有查到一个document.implementation.createDocument('', '', null)方法,但只能在 Firefox 下使用,放到 Webkit 核心的浏览器中还是不能正常工作。所以这里直接用到了 Ajax 请求的同步处理方式:
function load(url) {
var doc, loader;
if (window.ActiveXObject) {
try {
loader = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
loader = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else if (window.XMLHttpRequest) {
loader = new XMLHttpRequest();
}
if (loader != null) {
loader.open('GET', url, false);
loader.send(null);
doc = loader.responseXML;
}
return trim(doc);
}这两大段函数体中都出现了一个共同的函数:
function trim(doc) {
if (doc && doc.childNodes) {
var firstChild = doc.childNodes[0];
if (firstChild && firstChild.nodeType == 7) {
doc.removeChild(firstChild);
}
}
return doc.firstChild;
}这个函数是为了统一各种不同的 XML 解析结果的根结点(有些解析结果会附带编码说明,或直接取编码说明后的兄弟结点)。
理论阐述如此,而且已经在自己的本子上试过了。明天去有关部门实践一下~