zoukankan      html  css  js  c++  java
  • 使用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
  • 相关阅读:
    java后台对上传的图片进行压缩
    Reflections框架,类扫描工具
    commons-httpclient和org.apache.httpcomponents的区别
    sql里面插入语句insert后面的values关键字可省略
    Callable接口、Runable接口、Future接口
    Java多线程之Callable接口的实现
    说说Runnable与Callable
    论坛贴吧问题:如何终止运行时间超时的线程
    使用Future停止超时任务
    spring的@Transactional注解详细用法
  • 原文地址:https://www.cnblogs.com/chen110xi/p/5817101.html
Copyright © 2011-2022 走看看