我有一个像这样的XML结构:
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video>
<id>47288</id>
<thumbs>
<thumb><![CDATA[http://foo.com/bar.jpg]]></thumb>
</thumbs>
<link><![CDATA[http://foo.com/bar.html]]></link>
<title><![CDATA[Sample Title Here]]></title>
<categories>
<category><![CDATA[Cat1]]></category>
<category><![CDATA[Cat2]]></category>
</categories>
<tags>
<tag><![CDATA[Tag1]]></tag>
<tag><![CDATA[Tag2]]></tag>
<tag><![CDATA[Tag3]]></tag>
<tag><![CDATA[Tag4]]></tag>
<tag><![CDATA[Tag5]]></tag>
<tag><![CDATA[Tag6]]></tag>
</tags>
<duration><![CDATA[9:57]]></duration>
<pubDate><![CDATA[2013-12-17]]></pubDate>
</video>
// insert 200,000 more <video> entries here
不知道为什么这一切都写成CDATA,但我无能为力,这是我给出的数据。我读取这个大量(1.5gb)XML文件的代码是使用fs将其流式传输到sax然后传输到saxpath,如下所示:
var saxpath = require('saxpath')
var fs = require('fs')
var sax = require('sax')
var parseString = require('xml2js').parseString;
var util = require('util');
var saxParser = sax.createStream(true)
var streamer = new saxpath.SaXPath(saxParser, '/videos/video')
streamer.on('match', function(xml) {
console.log(xml);
parseString(xml, function (err, result) {
var json1 = JSON.stringify(result);
var json = JSON.parse(json1);
console.log(util.inspect(json, false, null));
});
});
fs.createReadStream('./xml/big_data_file.xml').pipe(saxParser)
然而,当我到达console.log(xml)时,它会显示:
<video>
<id>620339</id>
<thumbs>
<thumb></thumb>
</thumbs>
<link></link>
<title></title>
<categories>
<category></category>
<category></category>
</categories>
<tags>
<tag></tag>
<tag></tag>
<tag></tag>
<tag></tag>
<tag></tag>
<tag></tag>
<tag></tag>
</tags>
<duration></duration>
<pubDate></pubDate>
</video>
内部没有任何数据。 Saxpath Docs中没有提及CDATA,但我不确定这是Saxpath还是Sax本身的问题。
我有什么想法可以解决这个问题吗?
干杯!
答案 0 :(得分:1)
这是SaXPath 0.5.4的限制,刚推到npm的v0.5.5现在处理CDATA(请参阅commit),如你所料。
使用完全相同的代码和SaXPath的最新版本:
<video>
<id>47288</id>
<thumbs>
<thumb><![CDATA[http://foo.com/bar.jpg]]></thumb>
</thumbs>
<link><![CDATA[http://foo.com/bar.html]]></link>
<title><![CDATA[Sample Title Here]]></title>
<categories>
<category><![CDATA[Cat1]]></category>
<category><![CDATA[Cat2]]></category>
</categories>
<tags>
<tag><![CDATA[Tag1]]></tag>
<tag><![CDATA[Tag2]]></tag>
<tag><![CDATA[Tag3]]></tag>
<tag><![CDATA[Tag4]]></tag>
<tag><![CDATA[Tag5]]></tag>
<tag><![CDATA[Tag6]]></tag>
</tags>
<duration><![CDATA[9:57]]></duration>
<pubDate><![CDATA[2013-12-17]]></pubDate>
</video>
xml2js
的解析结果:
{ video:
{ id: [ '47288' ],
thumbs: [ { thumb: [ 'http://foo.com/bar.jpg' ] } ],
link: [ 'http://foo.com/bar.html' ],
title: [ 'Sample Title Here' ],
categories: [ { category: [ 'Cat1', 'Cat2' ] } ],
tags: [ { tag: [ 'Tag1', 'Tag2', 'Tag3', 'Tag4', 'Tag5', 'Tag6' ] } ],
duration: [ '9:57' ],
pubDate: [ '2013-12-17' ] } }