Node JS,Cheerio,获得XML版本

时间:2017-04-24 12:49:56

标签: javascript node.js xml xslt cheerio

我有一个具有这种结构的XML:

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="25-1.xsl"?>

<movies>
    <movie id="1">
    <title>Matrix</title>
    <characters>
        <character>
             <name>Tomas Anderson</name>
             <actor>Keanu Reeves</actor>
        </character>
    </characters>
    <plot>
        Action
    </plot>
    <rating type="stars">5</rating>
    </movie>
<movies>

我正在使用cheerio lib来访问此XML的DOM,我知道如何从标记中获取值。

但是,我不知道如何从<xml version="1.0" encoding="windows-1251"> <?xml-stylesheet type="text/xsl" href="25-1.xsl"?>

获取和更改数据

甚至可以通过cheerio访问这些引导标签吗?

1 个答案:

答案 0 :(得分:1)

我测试了多个xml解析器(x2jsxml-jsxml-parser),但似乎没有一个能够解析<?xml-stylesheet ?>标记。 对于其中一些,尝试解析此标记会导致无法解析整个XML。

所以我选择这个:xml-js

以下是如何使其发挥作用:

var convert = require('xml-js'); 
var converted = convert.xml2json(xml, {compact: true, spaces: 2});
console.log(JSON.parse(converted));

它为您提供有关<?xml ... ?>标记的信息:

{ _declaration: { _attributes: { version: '1.0', encoding: 'windows-1251' } }, ... }

因此,要解决xml-stylesheet标记的问题,您可以使用这一小段代码来解析xml中的所有这些标记:

var styleSheets = xml.match(/<\?xml-stylesheet.*\?>/g);
var arrayCSS = styleSheets.map(css => {                                                                                                                                                                                                       
    var tmp1 = css.split('?').splice(1,1);
    var tmp2 = tmp1[0].split(' ');
    tmp2.splice(0, 1);
    return tmp2.reduce((acc, el) => {
        var arr = el.split('=');
        acc[arr[0]] = arr[1].replace(/\"/g, '');
        return acc;
    }, {});
});

希望它有所帮助,

祝你好运