【问题标题】:How to read CDATA from an XML file in Node Sax如何从 Node Sax 中的 XML 文件中读取 CDATA
【发布时间】:2014-01-07 13:29:14
【问题描述】:

我有一个这样的 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 本身的问题。

有什么办法可以解决这个问题吗?

干杯!

【问题讨论】:

    标签: javascript xml node.js sax cdata


    【解决方案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' ] } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2010-12-16
      • 1970-01-01
      • 2017-07-02
      • 2012-07-18
      • 2017-02-12
      • 1970-01-01
      相关资源
      最近更新 更多