javascript - 解析 XML 和使用 xml-stream 收集子项时出现问题

标签 javascript node.js xml xml-parsing node-expat

我正在尝试在 Nodejs 脚本中使用 xml-stream 解析非常大的 XML 文件。

xml-stream 可以在这里找到 - https://github.com/assistunion/xml-stream

   <?xml version="1.0"?>
<Products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" version="0.96" versionTimestamp="2012-02-07T03:00:00Z" fooKey="6402420af51e08">
    <Product>
        <id>296834</id>
        <name>Thing</name>
        <Photos>
            <Photo>
                <MediaURL>http://url.com/to/image/file</MediaURL>
            </Photo>
            <Photo>
                <MediaURL>http://url.com/to/image/secondfile</MediaURL>
            </Photo>
            <Photo>
                <MediaURL>http://url.com/to/image/thirdfile</MediaURL>
            </Photo>
        </Photos>
    </Product>
</Products>

我的nodejs代码看起来像这样......

var fs        = require('fs')
, path      = require('path')
, XmlStream = require('xml-stream')
;

// Create a file stream and pass it to XmlStream
var stream = fs.createReadStream(path.join(__dirname, 'samplekirby.xml'));
var xml = new XmlStream(stream);

xml.preserve('Product', true);
xml.collect('Photos');
xml.on('endElement: Product', function(item) {
   console.log(item);
});

输出...

{ '$children': 
[ { '$children': [Object], '$text': '296834', '$name': 'id' },
 { '$children': [Object], '$text': 'Thing', '$name': 'name' },
 { '$children': [Object], Photo: [Object], '$name': 'Photos' } ],
id: { '$children': [ '296834' ], '$text': '296834', '$name': 'id' },
name: { '$children': [ 'Thing' ], '$text': 'Thing', '$name': 'name' },
Photos: 
{ '$children': [ [Object], [Object], [Object] ],
 Photo: { '$children': [Object], MediaURL: [Object], '$name': 'Photo' },
 '$name': 'Photos' },
'$name': 'Product' }

如何获取图像 URL?

我已经在不同的 Node 上以不同的顺序尝试了 .collect() 和 .preserve() 。这个库似乎没有很多更复杂的使用示例。我有非常大的 XML 文件,而 xml2js 无法处理它。如果我能弄清楚如何以某种方式增加深度,我会很高兴选择这个库。

最佳答案

如果您只想获取 URL

var fs = require('fs'),
    path = require('path'),
    XmlStream = require('xml-stream');

// Create a file stream and pass it to XmlStream
var stream = fs.createReadStream(path.join(__dirname, 'sample.xml'));
var xml = new XmlStream(stream);

xml.collect('Photo');
xml.on('endElement: Product', function(product) {
    console.log(JSON.stringify(product, null, 2));
})

输出:

{
  "id": "296834",
  "name": "Thing",
  "Photos": {
    "Photo": [
      {
        "MediaURL": "http://url.com/to/image/file"
      },
      {
        "MediaURL": "http://url.com/to/image/secondfile"
      },
      {
        "MediaURL": "http://url.com/to/image/thirdfile"
      }
    ]
  }
}

关于javascript - 解析 XML 和使用 xml-stream 收集子项时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41604409/

相关文章:

c# - 如何确保使用 utf-8 文件编码保存 XDocument?

javascript - 如何在 IE 中正确处理 XSL 转换并将结果作为文档片段

javascript - 要在不同 VS 解决方案中的多个应用程序中使用的自定义控件

javascript - 更改/更新格式时如何删除旧的 tinymce style_format 类

javascript - 通过代码从数组创建 Json 结构 - Typescript

java - Android 应用程序返回 NaN

javascript - 不使用 https 能否安全地将信息发送到服务器?

node.js - 同步处理新的 TCP 连接

javascript - 如何将客户端值从浏览器端传递到 Node.js Controller

javascript - Node JS 可执行应用程序框架或文件夹结构