我需要从JavaScript(实际上是从Greasemonkey)高效地访问一个大的gzipped xml文件。不幸的是,服务器没有提供Content-Encoding头信息,而Content-Type是"application/x-gzip",所以Firefox不会(据我所知)自动解压它。如果有一种方法可以欺骗Firefox,那就太理想了。除此之外,我需要一种有效的方式来进行解压缩...现在我正在使用的方法需要大约30秒才能解压缩1.2Mb的gzipped文件;我希望将其降至5秒以下。
(我正在开发的Greasemonkey脚本不能有任何其他外部服务器依赖项,因此代理和呈现Content-Encoding头信息不是一个选项。)
我现在正在做的事情是从几个地方拼凑起来的。为了接收未经处理的二进制数据,我正在使用firefox XMLHTTPRequest overrideMimeType扩展。
然后使用稍作修改并内联的https://github.com/dankogai/js-deflate/blob/master/rawinflate.js的副本进行解压缩(还有其他几个JavaScript解压缩库,据我所知都基于更旧的库http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt)。这是非常缓慢的部分。
(我正在开发的Greasemonkey脚本不能有任何其他外部服务器依赖项,因此代理和呈现Content-Encoding头信息不是一个选项。)
我现在正在做的事情是从几个地方拼凑起来的。为了接收未经处理的二进制数据,我正在使用firefox XMLHTTPRequest overrideMimeType扩展。
$.ajax(url, {
dataType:'text',
beforeSend:function(xhr){
xhr.overrideMimeType('text/plain; charset=x-user-defined')
},
success:function(data){
var blob='';
for (i=0; i<data.length; ++i)
blob += String.fromCharCode(data.charCodeAt(i) & 0xff);
...
然后使用稍作修改并内联的https://github.com/dankogai/js-deflate/blob/master/rawinflate.js的副本进行解压缩(还有其他几个JavaScript解压缩库,据我所知都基于更旧的库http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt)。这是非常缓慢的部分。
// blithely assuming the gzip header won't change,
// strip a fixed number of bytes from the front
deflated=RawDeflate.inflate(blob.substring(22,blob.length-8));
然后将其放入innerHTML属性中进行解析:
xmlcontainer=$('<div>');
// remove <?xml...> prolog
xmlcontainer.html(deflated.substring(45));
xmldoc=xmldoc.children();
我知道最后一部分可以更好地使用DOMParser的parseFromString来完成,但我还没有搞定。