【问题标题】:How do I efficiently access gzipped xml from javascript?如何有效地从 javascript 访问 gzipped xml?
【发布时间】:2011-03-06 20:21:41
【问题描述】:

我需要从 javascript(实际上来自 Greasemonkey)有效地访问一个大型 gzip 压缩的 xml 文件。 不幸的是,服务器没有提供 Content-Encoding 标头,并且 Content-Type 是“application/x-gzip”,所以 firefox 不会(据我所知)自动膨胀它。 如果有办法伪造Firefox,那将是理想的。除此之外,我需要一些方法来有效地进行通货膨胀......我现在使用的东西大约需要 30 秒才能对 1.2Mb gzip 压缩文件进行放气;我想在 5 秒内完成。

(我正在处理的 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 可以更正确地完成最后一点,但我还没有让它工作。)

【问题讨论】:

  • 遗憾的是,似乎没有浏览器将其解压缩算法暴露给 Javascript - 我想这将是容易做到的一半,也是最有效的方法
  • 这个你大概知道,但供参考stackoverflow.com/questions/294297/…
  • @Pekka,是的,我已经读过了,还有一个我现在找不到的问题,它有更多特定于 deflate 的链接。
  • @Pekka,我想浏览器开发人员可能从未想过这个想法。我的意思是,你会用它做什么? JS 不应该接触文件,如果设置正确,浏览器会自动处理其余部分。很难为像这样的异常情况做计划。

标签: javascript jquery xml gzip greasemonkey


【解决方案1】:

使用此配置**,您将无法做得更好。

JavaScript 速度太慢,无法按需要快速膨胀,而且您无法从 JS 可靠地调用二进制文件 - 除非将数据 AJAX 到您自己的服务器(可以是本地 PC)。

您的改进选项似乎是:

  1. 让浏览器自动扩充内容。如果您已经尝试使用overrideMimeType 设置application/x-gzip,您可以尝试使用GM_xmlhttpRequest 代替(这是一个很长的镜头)。

  2. 将其从 GM 脚本转换为 Firefox 插件。作为附加组件,您可以访问二进制文件,例如 7-Zip,甚至可以访问浏览器的 inflate 方法。您也可以更轻松地欺骗 mimetype。



**我确实注意到了一些微不足道的机会来加速膨胀的 JS……像 length 检查 for 循环内的东西。唉,考虑到细节,可能不会超过一两秒钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-06-13
    • 2017-01-12
    • 2018-08-10
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多