Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript lazy.js和xml流解析_Javascript_Node.js_Lazy Evaluation - Fatal编程技术网

Javascript lazy.js和xml流解析

Javascript lazy.js和xml流解析,javascript,node.js,lazy-evaluation,Javascript,Node.js,Lazy Evaluation,我试图用xml流模块惰性地解析kml文件,但缺少相关示例。这是到目前为止我的代码 var fs = require('fs'); var path = require('path'); var xmlStream = require('xml-stream'); var lazy = require('lazy.js') var stream = fs.createReadStream('./Sindh.kml'); var xml = new xmlStream(stream); var

我试图用xml流模块惰性地解析kml文件,但缺少相关示例。这是到目前为止我的代码

var fs = require('fs');
var path = require('path');
var xmlStream = require('xml-stream');
var lazy = require('lazy.js')

var stream = fs.createReadStream('./Sindh.kml');

var xml = new xmlStream(stream);

var onlyEvents = function(e) {
    if (e && e._events) {
        return 1;
    }
    else {
        return 0;
    }
}

lazy(xml).filter(onlyEvents).take(20).each(function(e) {
    console.log(e);
    console.log('\n');
});

//xml.preserve('Polygon', true);
//xml.on('endElement: Polygon', function(poly) {
//  var coordString =  poly.outerBoundaryIs.LinearRing.coordinates.$children.join().trim();


  //console.log('\n\n');
//})
因此,我们的想法是通过过滤endElement事件上事件发射器的输出来复制注释文本的行为。我在这里通过运行代码得到输出,我只是不知道我在看什么或者从这里到哪里去


我是streams和lazy.js的新手,如果这是一个完全没有问题的问题,我深表歉意。也许我只是不理解我从循环中得到的对象。

因此,昨天我发布了Lazy.js的0.3.2版,其中包括一个名为。从文档中:

为自定义StreamLikeSequence定义包装器。这是有用的,如果 您需要一种将事件流作为序列处理的方法,但是 无法使用Lazy的现有接口(即,正在包装对象 来自具有自己的自定义事件的库)

不要无限期地指望这种方法以这种确切的形式存在(甚至有这种确切的名称);这只是Lazy 1.0中最终可能出现的情况的初步概述。但由于它目前的存在,这里有一个示例,说明了如何使用Google的
xml流
库来实现您的目的(我不知道这是否是您正在使用的“KML”;但无论如何,它都应该说明这是如何工作的):


这是一个棘手的问题,因为
xml stream
库似乎公开了类似stream的内容,它为您的日常
stream.Readable
节点提供了稍微不同的接口。Lazy目前还没有提供将任意源打包为序列的方法。然而,这是我将在不久的将来补充的内容。我会在有问题的时候再问这个问题。谢谢你的回答。因此,我想现在我的选择是编写一个自定义序列来解析xml,就像您在json示例中所做的那样,或者编写一个更严格遵守stream.Readable接口的xml流模块。如果我采用后一种方法,我应该期望lazy的每个输出都像on.data事件,对吗?很好!我很快就会试试这个。我认为这将是一个很好的概念添加。在我研究npm模块的过程中,我注意到了很多类似流的“模式”,特别是在解析器中。
var fs        = require('fs'),
    XmlStream = require('xml-stream'),
    Lazy      = require('./lazy.node');

// Here we are wrapping an XML stream as defined by xml-stream. We're defining
// our wrapper so that it takes the stream as the first argument, and the
// selector to scan for as the second.
var wrapper = Lazy.createWrapper(function(source, selector) {
  // Within this wrapper function, 'this' is bound to the sequence being created.
  var sequence = this;

  // The xml-stream library emits the event 'endElement:x' when it encounters
  // an <x> element in the document.
  source.on('endElement:' + selector, function(node) {
    // Calling 'emit' makes this data part of the sequence.
    sequence.emit(node);
  });
});

// We can now use the factory we just defined to create a new sequence from an
// XML stream.
var stream = fs.createReadStream('KML_Samples.kml');
var xml = new XmlStream(stream);
var sequence = wrapper(xml, 'Placemark');

// This sequence can be used just like any other, with all of the same helper
// methods we know and love.
sequence.skip(5).take(5).pluck('name').each(function(placemarkName) {
  console.log(placemarkName);
});
Tessellated
Untessellated
Absolute
Absolute Extruded
Relative