惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
量子位
人人都是产品经理
人人都是产品经理
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
Recent Announcements
Recent Announcements
A
About on SuperTechFans
Microsoft Security Blog
Microsoft Security Blog
N
Netflix TechBlog - Medium
H
Help Net Security
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
The Cloudflare Blog
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
Vercel News
Vercel News

囧克斯

奔四了,写给40岁的自己 有序退网 我和 Vue.js 的十年 我参与《代码之外 Beyond Code》的故事 博客站迁移至 VitePress 的备忘 写给我的奶奶 中文格式化小工具 zhlint 及其开发心得 vue-mark-display:用 markdown 语法轻松撰写幻灯片 我对技术会议的一些看法 VueConf Hangzhou 见闻 第四届 CSSConf CN 见闻 [译]Web 表单的未来 [译]苹果正在做一些他们的程序员明摆着不想要的东西 [译]为什么我不会无偿加班且你也不应该 [译]如果管理是唯一可走的路,那就完蛋了 [译]如何撰写 Git 提交信息 [译]C 程序的原则 Vue 2.0 来了! Weex 近 4 个月的开源之路 Weex 在 JS Runtime 内的多实例管理 我理解的 SPA 我理解的 Flux 架构 【整理】Vue 2.0 自 beta 1 到 beta 4 以来的主要更新 通过一张图走进 Vue 2.0 Code Review for Vue 2.0 Preview Vue 2.0 发布啦! 务实的小而美 Vue.js 1.0.0 发布了! [译]如何成为一名卓越的前端工程师 手机淘宝前端的图片相关工作流程梳理
JS 对 XML 文件与 XML 字符串的解析
勾三股四 · 2009-12-29 · via 囧克斯

本文摘自 勾三股四 更早时期的 不老歌 博客。


最近在协助某神秘的“有关部门”调试一个神秘的 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 解析结果的根结点(有些解析结果会附带编码说明,或直接取编码说明后的兄弟结点)。

理论阐述如此,而且已经在自己的本子上试过了。明天去有关部门实践一下~