var wows = require('vows'); var assert = require('assert'); var XMLSerializer = require('xmldom').XMLSerializer; var DOMParser = require('xmldom').DOMParser; var DomJS = require("dom-js").DomJS; try{ var Libxml = require('libxmljs'); }catch(e){ } function xmldom(data){ console.time('xmldom'); var doc = new DOMParser({locator:null,checkLater:true}).parseFromString(data); console.timeEnd('xmldom'); doc.toString = function(){ return new XMLSerializer().serializeToString(doc); } return doc; } function libxml(data){ if(Libxml){ console.time('libxml'); var doc = Libxml.parseXmlString(data); console.timeEnd('libxml'); var ToString=doc.toString ; doc.toString = function(){ return ToString.apply(this,arguments).replace(/^\s+|\s+$/g,''); } return doc; }else{ console.warn('libxml is not installed') } } function domjs(data){ console.time('dom-js'); var doc; new DomJS().parse(data, function(err, dom) { doc = dom; }); console.timeEnd('dom-js'); doc.toString = function(){ return doc.toXml(); } return doc } var maxRandomAttr =parseInt(Math.random()*60); console.log('maxRandomAttr',maxRandomAttr) function addAttributes(el){ var c =parseInt(Math.random()*maxRandomAttr); while(c--){ el.setAttribute('dynamic-attr'+c,c+new Array(c).join('.')); } var child = el.firstChild; while(child){ if(child.nodeType == 1){ addAttributes(child) }else if(child.nodeType == 4){//cdata el.insertBefore(el.ownerDocument.createTextNode(child.data),child); el.removeChild(child); } child = child.nextSibling; } } // Create a Test Suite wows.describe('XML Node Parse').addBatch({ "big file parse":function(){ var fs = require('fs'); var path = require('path') var data = fs.readFileSync(path.resolve(__dirname,'./test.xml'), 'ascii'); //data = " ![CDATA[v]] d &\n" console.log('test simple xml') var t1 = new Date(); var doc1 = xmldom(data); var t2 = new Date(); var doc2 = domjs(data); var t3 = new Date(); var doc3 = libxml(data); var t4 = new Date(); var xmldomTime = t2-t1; var domjsTime = t3-t2; console.assert(domjsTime>xmldomTime,'xmldom performance must more height!!') doc1 = doc1.cloneNode(true); addAttributes(doc1.documentElement); data = doc1.toString(); console.log('test more attribute xml') var t1 = new Date(); var doc1 = xmldom(data); var t2 = new Date(); var doc2 = domjs(data); var t3 = new Date(); var doc3 = libxml(data); var t4 = new Date(); var xmldomTime = t2-t1; var domjsTime = t3-t2; console.assert(domjsTime>xmldomTime,'xmldom performance must more height!!') function xmlReplace(a,v){ switch(v){ case '&': return '&' case '<': return '<' default: if(v.length>1){ return v.replace(/([&<])/g,xmlReplace) } } } xmldomresult = (domjs(doc1+'')+'').replace(/^<\?.*?\?>\s*|/g,xmlReplace) domjsresult = (doc2+'').replace(/^<\?.*?\?>\s*|/g,xmlReplace) data = xmldomresult; //console.log(data.substring(100,200)) console.log('test more attribute xml without cdata') var t1 = new Date(); var doc1 = xmldom(data); var t2 = new Date(); var doc2 = domjs(data); var t3 = new Date(); var doc3 = libxml(data); var t4 = new Date(); var xmldomTime = t2-t1; var domjsTime = t3-t2; console.assert(domjsTime>xmldomTime,'xmldom performance must more height!!') //console.log(xmldomresult,domjsresult) //assert.equal(xmldomresult,domjsresult); //,xmldomresult,domjsresult) if(xmldomresult !== domjsresult){ for(var i=0;i