並不是所有的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
http://ourjs.com/detail/54b1ce8c232227083e000004