xml2js模块应用
并不是所有的API都是以JSON格式返回的。我们有时侯不得不处理一些XML。幸运的是有一个NodeJS模块 xml2js 可以帮你做这件事。
处理一段xml文件内容1
2
3
4
5
6
7
8
9
10
11
12
13
<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>
最关键的一点是安装xml2js库,所以你可以在命令行输入
在app.js中添加如下内容1
2
3
4
5var 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));
});
编译app.js1
> node app.js
如果一切顺利你会得到JSON格式的输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"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 来解决:
1 | xml2js.parseString(xmlStr, { explicitArray : false, ignoreAttrs : true }, callbackMethod); |
性能比较
有人指出xml2js的速度过慢,有人做过性能测试, htmlparser2 的性能提升大约5倍以上,如下图
另外还有一个使用C语言写的xml解析器 node-expat ,性能更好,
安装1
npm i node-expat
不过使用也很“底层“, 对性能有一定要求的应用可以尝试一下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25(function () {
;
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