登录
注册
node.js 学习社区
使用NodeJS将XML解析成JSON及性能比较

新手村长老

2015-04-10 09:43

并不是所有的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

回复 · 0

发表回复

你可以在回复中 @ 其他人