NodeJS parseStream,定义块的起点和终点

2023-12-27

对 Node 的文件系统解析感到困惑。这是我的代码:

var fs = require('fs'),
    xml2js = require('xml2js');

var parser = new xml2js.Parser();

var stream = fs.createReadStream('xml/bigXML.xml');
stream.setEncoding('utf8');

stream.on('data', function(chunk){ 

    parser.parseString(chunk, function (err, result) {
        console.dir(result);
        console.log('Done');
    });
});


stream.on('end', function(chunk){
    // file have been read over,do something...
    console.log("IT'S OVER")
});

这会导致……什么也不会发生。 XML2JS/解析器根本没有输出。当我尝试console.log(chunk)看来chunks除了字节大小之外,不会以任何有意义的块的形式输出。一个“块”的输出是:

<?xml version="1.0" encoding="UTF-8"?>
    <merchandiser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="merchandiser.xsd">
    <header><merchantId>1237</merchantId><merchantName>NORDSTROM.com</merchantName><createdOn>12/13/2013 23:50:57</createdOn></header>
    <product product_id="52863929">// product info</product>
    <product product_id="26537849">// product info</product>
    <product product_id="25535647">// product info</product>

这个块有很多很多<product>来自其中的 XML 的条目。该块将在 a 中间的某个位置结束<product>条目和下一个块将从中断处开始。

主要问题是我如何获得createReadStream输出从以下位置开始的块<product并结束于</product>?

编辑:为了获得正确的输出,以下是第一个 XML 从开始到结束的内容<product>好像:

<?xml version="1.0" encoding="UTF-8" ?>
<merchandiser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="merchandiser.xsd">
  <header>
    <merchantId>1237</merchantId>
    <merchantName>NORDSTROM.com</merchantName>
    <createdOn>12/13/2013 23:50:57</createdOn>
  </header>
  <product product_id="52863929" name="Teva 'Psyclone' Print Sandal (Baby, Walker &amp; Toddler) Camo/ Dark Olive 6 M" sku_number="52863929" manufacturer_name="Teva" part_number="1001701">
    <category>
      <primary>Toddler Unisex</primary>
      <secondary>Shoes~~Sandals/Slides</secondary>
    </category>
    <URL>
      <product>http://click.linksynergy.com/link?id=LUyP0GcLCGc&amp;offerid=276223.52863929&amp;type=15&amp;murl=http%3A%2F%2Fshop.nordstrom.com%2FS%2F3297406%3Fcm_cat%3Ddatafeed%26cm_pla%3Dshoes%3Asandals%252fslides%26cm_ite%3Dteva_%2527psyclone%2527_print_sandal_%2528baby%252c_walker_%2526_toddler%2529%3A503158_1%26cm_ven%3DLinkshare</product>
      <productImage>http://content.nordstrom.com/imagegallery/store/product/large/0/_6880020.jpg</productImage>
      <buy></buy>
    </URL>
    <description>
      <short>Rugged construction and stylish good looks define a sporty sandal, with the added convenience and security of hook-and-loop closures across the toe and at the instep.Rugged construction and stylish good looks define a sporty sandal, with the added
        convenience and security of h...</short>
      <long>Rugged construction and stylish good looks define a sporty sandal, with the added convenience and security of hook-and-loop closures across the toe and at the instep.Rugged construction and stylish good looks define a sporty sandal, with the added
        convenience and security of hook-and-loop closures across the toe and at the instep. Color(s): camo/ dark olive, daisy blue. Brand: Teva. Style Name: Teva 'Psyclone' Print Sandal (Baby, Walker &amp; Toddler). Style Number: 503158_1.</long>
    </description>
    <discount currency="USD">
      <amount></amount>
      <type>amount</type>
    </discount>
    <price currency="USD">
      <sale begin_date="" end_date="">24.95</sale>
      <retail>24.95</retail>
    </price>
    <brand>Teva</brand>
    <shipping>
      <cost currency="USD">
        <amount>0.00</amount>
        <currency>USD</currency>
      </cost>
      <information></information>
      <availability>Y</availability>
    </shipping>
    <keywords></keywords>
    <upc>737872649135</upc>
    <m1>503158_1.</m1>
    <pixel>http://ad.linksynergy.com/fs-bin/show?id=LUyP0GcLCGc&amp;bids=276223.52863929&amp;type=15&amp;subid=0</pixel>
    <attributeClass class_id="60">
      <Misc></Misc>
      <Product_Type>Shoes</Product_Type>
      <Size>6 M</Size>
      <Material></Material>
      <Color>CAMO/ DARK OLIVE</Color>
      <Gender>Unisex</Gender>
      <Style></Style>
      <Age></Age>
    </attributeClass>
  </product>

您有两种可能性来解决您的问题。

正如damphat 所说,XML2JS 需要完整的XML 内容才能解析数据。但是你有一个文件流,它逐块地传输数据。第一个解决方案是将这个数据流转换成一个漂亮的大Buffer,然后将其发送到XML2JS。为此,您可以使用stream-to package https://npmjs.org/package/stream-to (npm i stream-to)它将把文件流转换成一个缓冲区数组,然后我们将使用它连接成一个缓冲区Buffer.concat http://nodejs.org/docs/latest/api/buffer.html#buffer_class_method_buffer_concat_list_totallength, 像这样:

var fs = require('fs')
var streamTo = require('stream-to')
var xml2js = require('xml2js')

var file = fs.createReadStream('input.xml')

streamTo.array(file, function (err, arr) {
    if (err) return console.log(err.message)

    var content = Buffer.concat(arr)
    var parser = new xml2js.Parser()
    parser.parseString(content, function (err, res) {
        if (err) return console.log(err.message)
        console.log(res.merchandiser.product)
    })
})

这工作得很好,但由于它需要将完整的文件保存到内存中,所以如果您的输入文件非常大,它就不起作用。要处理非常大的文件,您需要使用流式 XML 解析器,例如sax。然而sax不创建 Javascript 对象,而是一个 EventEmitter,并且使用起来有点困难,因为您必须处理所有相关事件才能动态构建对象。

例如,您可以使用SaXPath 库 https://npmjs.org/package/saxpath,它支持 XPath 语法的一小部分。这个库发出一个match每次与 XPath 模式匹配时都会发生事件。这是一个例子:

var saxpath = require('saxpath')
var fs = require('fs')
var sax = require('sax')

var saxParser = sax.createStream(true)
var streamer = new saxpath.SaXPath(saxParser, '/merchandiser/product')

streamer.on('match', function(xml) {
    console.log(xml);
});

fs.createReadStream('input.xml').pipe(saxParser)

然后你有两个选择:

  1. 由于您现在拥有一次仅匹配一种产品的 XML,因此您可以使用xml2js一次解析一个产品
  2. SaXPath 支持多个记录器:默认记录器侦听 sax 事件并重新创建相应的 XML(这使我们能够使用第一个解决方案),但是您可以推出自己的记录器,该记录器侦听 sax 事件并在飞行 javascript 对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS parseStream,定义块的起点和终点 的相关文章

随机推荐

  • MySql:设置重复列的限制

    好的 我的桌子上有一个名为 style number 的列 style number 可以有重复项 我想选择所有内容 但每个款式编号最多只能选择 3 个 例如 如果有 4 行的 style number style 7 则只会选择这 4 行
  • 禁用合并/更新的 Hibernate 验证

    我有一个 POJO 叫Order如下 public class Order Id GeneratedValue Column name id protected int id NotNull Future protected Date de
  • Instagram 会为纵向/横向图像提供方形缩略图吗?

    我们的网站中有一个定制的 Instagram 集成 其设计假设 并且目前取决于 它显示的图像是正方形的 Instagram 今天宣布他们将支持风景和肖像照片 即使 Instagram 图像是纵向 横向 有没有办法只加载方形图像 缩略图 Ye
  • Ruby 中 nil:NilClass 的 Aws::S3::Presigner 未定义方法凭证

    我使用了 aws sdk core gem 我在获取 url 表单 aws 时遇到错误 以下是我的代码 def initialize bucket region bucket bucket client Aws S3 Client new
  • 在 Elm 中声明模块之外访问联合类型

    Given module 1 module Module1 exposing Message where type Message Test String Error Int module 2 module Module2 exposing
  • LD_LIBRARY_PATH :如何查找共享对象

    我有一个共享对象 libxyz so 给定LD LIBRARY PATH 如何找到这个共享对象的确切位置 如果我有一个依赖于这个库的二进制文件 我会在上面使用 ldd 这就是我问的原因 我有一个 cgi 脚本 当使用 LD LIBRARY
  • AutoScrollPosition 将其设置为点位置后不会报告正确的值

    我有一个用户控件 它是可滚动控件 我想更改它AutoScrollPosition 仅 X 值 我这样做是这样的 int newScrollX myFunction Point p new Point newScrollX this Auto
  • 如何实现Cordova App与Native WatchKit Extension之间的通信

    我想通过 WatchKit 应用程序 用 swift 原生编写 扩展 ionic Cordova IOS 应用程序 我想知道哪种方式是两者之间沟通的最佳方式 我检查了插件 github com leecrossley cordova plu
  • 可靠地消除 Webkit 通知

    我成功创建和取消了 webkit 通知 如下所示 notification window webkitNotifications createNotification foo png bar baz notification show se
  • 在 Bash while 循环中使用“and”

    好的 脚本基本上是这样的 echo n Guess my number read guess while guess 5 do echo Your answer is guess This is incorrect Please try a
  • 如何在magento中覆盖product.js文件

    我想覆盖 Product js 文件以在某些函数中添加一些额外的值 我已将文件从 js mage adminhtml product js 复制到我的文件夹 如 js myfolder myproduct js 我如何使用当我尝试使用该文件
  • 在 CocoaPod 中结合 Swift 和 Objective-C

    我正在尝试向现有的 Objective C CocoaPod 添加一些 Swift 代码 我已经为示例项目添加了桥接标头 但实际上无法验证我的 podspec 文件 因为 CocoaPods 不知道我的桥接标头文件 有人知道如何解决这个问题
  • 使用 python 和 urllib 从网页打印代码

    我正在尝试使用 python 和 urllib 来查看某个网页的代码 我已经使用以下代码在其他网页上尝试并成功了 from urllib import url code urlopen url read print code 但它什么也没返
  • 如何修剪 jpg 中包含的 XMP XML

    通过使用 sanselan 我发现导入到 Windows 的 iPhone 照片变得不可编辑的根本原因是实际 XML 之后有内容 空白 有关更多详细信息和不良 XMP XML 的链接示例 请参阅https apple stackexchan
  • asp.net core 波形符斜杠 (~/) 无法解析图像路径

    我的 Index cshtml 视图中有一些标记 它具有内联 css 样式background image财产 渲染页面时 不会生成正确的图像路径 并且波浪号保留在 url 中 HTML 标记 上使用的路径img页面渲染时标签可以正常工作
  • 放大视觉工作室表单设计器

    我正在使用 Visual Studio 2013 表单设计器来编辑表单 设计器窗口中的表单尺寸太大 所以我想缩小 在 Photoshop 或 Blend 等应用程序中 我可以 除其他外 使用键盘快捷键 Ctrl 0 使设计适合屏幕 在 Vi
  • 递归进入executePendingTransactions

    我有一个 MainDrawer to Fragment 活动 其中有一个导航抽屉的布局和我的主要内容 我可以在其中加载新片段 我加载的一个片段称为 StatisticsTab Fragment 该片段包含一个选项卡主机 其中每个选项卡都是其
  • 将 Android 移动应用程序连接到云数据库 (Amazon RDS)

    我有一个 Android 应用程序 我想将本地数据库移动到云中 我决定使用 SQL 数据库而不是 NoSQL 因为我想执行复杂的查询 我在 Amazon 的 RDS 中创建了一个数据库实例 并填充了该数据库 现在我想将我的移动应用程序连接到
  • Android studio:不显示过滤器选项

    我的 android studio logcat 未显示过滤器选项 我认为某些设置已更改 我和你有同样的问题 包括在完成 Ubuntu 13 04 的全新 格式化磁盘 安装和所有内容的全新安装之后 今天我终于想出了一些神奇的窗口 选项卡拖动
  • NodeJS parseStream,定义块的起点和终点

    对 Node 的文件系统解析感到困惑 这是我的代码 var fs require fs xml2js require xml2js var parser new xml2js Parser var stream fs createReadS