使用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
 
http://ourjs.com/detail/54b1ce8c232227083e000004


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM