NodeJS之将XML解析成JSON及性能比较

并不是所有的API都是以JSON格式返回的。我们有时侯不得不处理一些XML。幸运的是有一个NodeJS模块  xml2js 可以帮你做这件事。

比如,我们要处理下面这段XML

<?xml version="1.0" encoding="UTF-8" ?>
<business>
    <company>Code Blog</company>
    <owner>Nic Raboy</owner>
    <employee>
        <firstname>Nic</firstname>
        <lastname>Raboy</lastname>
    </employee>
    <employee>
        <firstname>Maria</firstname>
        <lastname>Campos</lastname>
    </employee>
</business>


现在创建一个项目目录,添加一个JavaScript文件,它会进行,如果你使用Terminal,你就可以这样:

mkdir TestApp
cd TestApp
touch app.js

最关键的一点是安装xml2js库,所以你可以在命令行输入

npm install xml2js

安装成功之后你会在当前目录发现一个 node_modules目录,里面有一个xml2js。

在app.js中添加如下内容:

var parseString = require('xml2js').parseString;
var xml = '<?xml version="1.0" encoding="UTF-8" ?><business><company>Code Blog</company><owner>Nic Raboy</owner><employee><firstname>Nic</firstname><lastname>Raboy</lastname></employee><employee><firstname>Maria</firstname><lastname>Campos</lastname></employee></business>';
parseString(xml, function (err, result) {
    console.dir(JSON.stringify(result));
});


现在你可以用Node.JS运行你的应用了,使用下面的命令:

node app.js

如果一切顺利你会得到JSON格式的输出:

{
    "business": {
        "company": [ "Code Blog" ],
        "owner": [ "Nic Raboy" ],
        "employee": [
            {
                "firstname": [ "Nic" ],
                "lastname": [ "Raboy" ]
            },
            {
                "firstname": [ "Maria" ],
                "lastname": [ "Campos" ]
            }
        ]
    }
}

有一点需要注意,XML字符串元素转换成了JSON的数组。你可能期望 { owner: “Nic Raboy” } 但实际输出的是 { owner: [ “Nic Raboy” ] },但这不是什么大问题。

注* 可以通过 explicitArray: false 来解决:

xml2js.parseString(xmlStr, { explicitArray : false, ignoreAttrs : true }, callbackMethod);

性能比较


有人指出xml2js的速度过慢,有人做过性能测试,  htmlparser2  的性能提升大约5倍以上,如下图 ,测试 地址 






另外还有一个使用C语言写的xml解析器 node-expat,性能更好,

安装

npm i node-expat 

不过使用也很“底层“, 对性能有一定要求的应用可以尝试一下:

(function () { 
“use strict”;

var expat = require(‘node-expat’)
var parser = new expat.Parser(‘UTF-8’)

parser.on(‘startElement’, function (name, attrs) {
console.log(name, attrs)
})

parser.on(‘endElement’, function (name) {
console.log(name)
})

parser.on(‘text’, function (text) {
console.log(text)
})

parser.on(‘error’, function (error) {
console.error(error)
})

parser.write(‘<html><head><title>Hello World</title></head><body><p>Foobar</p></body></html>’)

}())
不过还有一些项目对 expat 进行了封装,简化了调用接口,比如: xml2obj-stream



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值