【问题标题】:How to transform (simple) streaming XML in Node.js?如何在 Node.js 中转换(简单)流 XML?
【发布时间】:2012-10-09 05:20:07
【问题描述】:

我正在通过我的 Node.js 服务器代理一个 S3 调用,并且想在代理它们之前只调整几个返回的 XML 值。除了那些调整之外,我想保留每个响应的其余部分,例如响应头。

我当然可以先收集整个响应,解析 XML,对其进行转换,然后将其返回,但对于大型响应而言,这将是缓慢且占用大量内存的。有没有一种方法可以实现基本的stream.pipe(),但可能需要转换功能?

我看过sax-js,它可以管道但没有任何转换能力。我是否必须求助于侦听低级解析事件并自己生成和输出生成的 XML?

我也看过 libxmljs,它有一个“推送解析器”和一个更高级别的 DOM API,但看起来我又不得不听低级解析我自己的事件,而且我不确定我是否可以在生成的 XML out 流式传输它。

还有比这两种方法更简单的方法吗?谢谢!

附: XML 调整很简单:只需从一些文本元素中删除一个子字符串。

【问题讨论】:

    标签: xml node.js stream


    【解决方案1】:

    在这种情况下,您可以将所有块收集在一起,如下所示:

    var data='', tstream = new stream.Transform();
    tstream._transform = function (chunk, encoding, done) {
        data += chunk.toString();
        done();
    };
    

    并在最后一次调用 _flush 函数时做你需要做的事情:

    tstream._flush = function(done){
        data += 'hola muheres';
        this.push(data);
        done();
    };
    

    所以它们看起来像这样:

    req.pipe(anotherstream).pipe(tstream).pipe(response);
    

    【讨论】:

    • 不错。这是一个 Streams2 功能吗?
    • 这与完全解析它但通过流进行解析完全相同。
    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多