libexpat XML SAX parser binding for node.js
384
stars
254
commits
JavaScript
primary language
Jan 21, 2026
updated
You use Node.js for speed? You process XML streams? Then you want the fastest XML parser: libexpat!
npm install node-expat
Important events emitted by a parser:
(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>')
}())
#on('startElement' function (name, attrs) {})#on('endElement' function (name) {})#on('text' function (text) {})#on('processingInstruction', function (target, data) {})#on('comment', function (s) {})#on('xmlDecl', function (version, encoding, standalone) {})#on('startCdata', function () {})#on('endCdata', function () {})#on('entityDecl', function (entityName, isParameterEntity, value, base, systemId, publicId, notationName) {})#on('error', function (e) {})#stop() pauses#resume() resumesWe don't emit an error event because libexpat doesn't use a callback
either. Instead, check that parse() returns true. A descriptive
string can be obtained via getError() to provide user feedback.
Alternatively, use the Parser like a node Stream. write() will emit
error events.
A word about special parsing of xmlns: this is not necessary in a bare SAX parser like this, given that the DOM replacement you are using (if any) is not relevant to the parser.
npm run benchmark
| module | ops/sec | native | XML compliant | stream |
|---|---|---|---|---|
| sax-js | 99,412 | ☐ | ☑ | ☑ |
| node-xml | 130,631 | ☐ | ☑ | ☑ |
| libxmljs | 276,136 | ☑ | ☑ | ☐ |
| node-expat | 322,769 | ☑ | ☑ | ☑ |
Higher is better.
npm install -g standard
npm test
If you fail to install node-expat as a dependency of node-xmpp, please update node-xmpp as it doesn't use node-expat anymore.
Dependencies for node-gyp https://github.com/TooTallNate/node-gyp#installation
See https://github.com/astro/node-expat/issues/78 if you are getting errors about not finding nan.h.
VCBUILD : error : project file 'node-expat\build\deps\libexpat\expat.vcproj' was not found or not a valid proj
ect file. [C:\Users\admin\AppData\Roaming\npm\node_modules\node-expat\build\bin
ding.sln]
Install Visual Studio C++ 2012 and run npm with the --msvs_version=2012 flag.
JavaScript
55.0%
C++
44.1%
libexpat XML SAX parser binding for node.js
384
stars
254
commits
JavaScript
primary language
Jan 21, 2026
updated
You use Node.js for speed? You process XML streams? Then you want the fastest XML parser: libexpat!
npm install node-expat
Important events emitted by a parser:
(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>')
}())
#on('startElement' function (name, attrs) {})#on('endElement' function (name) {})#on('text' function (text) {})#on('processingInstruction', function (target, data) {})#on('comment', function (s) {})#on('xmlDecl', function (version, encoding, standalone) {})#on('startCdata', function () {})#on('endCdata', function () {})#on('entityDecl', function (entityName, isParameterEntity, value, base, systemId, publicId, notationName) {})#on('error', function (e) {})#stop() pauses#resume() resumesWe don't emit an error event because libexpat doesn't use a callback
either. Instead, check that parse() returns true. A descriptive
string can be obtained via getError() to provide user feedback.
Alternatively, use the Parser like a node Stream. write() will emit
error events.
A word about special parsing of xmlns: this is not necessary in a bare SAX parser like this, given that the DOM replacement you are using (if any) is not relevant to the parser.
npm run benchmark
| module | ops/sec | native | XML compliant | stream |
|---|---|---|---|---|
| sax-js | 99,412 | ☐ | ☑ | ☑ |
| node-xml | 130,631 | ☐ | ☑ | ☑ |
| libxmljs | 276,136 | ☑ | ☑ | ☐ |
| node-expat | 322,769 | ☑ | ☑ | ☑ |
Higher is better.
npm install -g standard
npm test
If you fail to install node-expat as a dependency of node-xmpp, please update node-xmpp as it doesn't use node-expat anymore.
Dependencies for node-gyp https://github.com/TooTallNate/node-gyp#installation
See https://github.com/astro/node-expat/issues/78 if you are getting errors about not finding nan.h.
VCBUILD : error : project file 'node-expat\build\deps\libexpat\expat.vcproj' was not found or not a valid proj
ect file. [C:\Users\admin\AppData\Roaming\npm\node_modules\node-expat\build\bin
ding.sln]
Install Visual Studio C++ 2012 and run npm with the --msvs_version=2012 flag.
JavaScript
55.0%
C++
44.1%