README
xml-streamer
Motivation
You use Node.js for speed? You process XML streams? Then you want the fastest XML to JS parser: xml-streamer
, based on node-expat and It implements the Node.js stream.Transform API
.
Install
npm install xml-streamer
Basic Usage
xml-streamer can be used in four ways
// 1. By passing the resourcePath and reading data by calling `read` method instead listening for data events.
(function () {
"use strict";
var Parser = require('xml-streamer')
var opts = {resourcePath: '/items/item'}
var parser = new Parser(opts)
parser.on('end', function () {
// parsing ended no more data events will be raised
})
parser.on('error', function (error) {
// error occurred
// NOTE: when error event emitted no end event will be emitted
console.error(error)
})
xmlStream.pipe(parser) // pipe your input xmlStream to parser.
// readable
parser.on('readable', function () {
// if you don't want to consume "data" on "data" events you can wait for readable event and consume data by calling parser.read()
})
// after readable event occured you can call read method and get data.
parser.read() // will return one object at a time.
}())
// 2. By listening for interested nodes.
(function () {
"use strict";
var Parser = require('xml-streamer')
var opts = {} // see `Available Constructor Options` section below.
var parser = new Parser(opts)
parser.on('item', function (item) {
// consume the item object here
})
parser.on('end', function () {
// parsing ended no more data events will be raised
})
parser.on('error', function (error) {
// error occurred
// NOTE: when error event emitted no end event will be emitted
console.error(error)
})
xmlStream.pipe(parser) // pipe your input xmlStream to parser.
// readable
parser.on('readable', function () {
// if you don't want to consume "data" on "data" events you can wait for readable event and consume data by calling parser.read()
})
}())
// 3. By passing a resource path.
(function () {
"use strict";
var Parser = require('xml-streamer')
var opts = {resourcePath: '/items/item'}
var parser = new Parser(opts)
parser.on('data', function (data) {
// consume the data object here
})
parser.on('end', function () {
// parsing ended no more data events will be raised
})
parser.on('error', function (error) {
// error occurred
// NOTE: when error event emitted no end event will be emitted
console.error(error)
})
xmlStream.pipe(parser) // pipe your input xmlStream to parser.
// readable
parser.on('readable', function () {
// if you don't want to consume "data" on "data" events you can wait for readable event and consume data by calling parser.read()
})
}())
// 4. By passing a string or buffer to parse function
(function () {
"use strict";
var Parser = require('xml-streamer')
var opts = {resourcePath: '/items/item'} // resourcePath is manditory when using parse method
var parser = new Parser(opts)
parser.parse(stringOrBuffer, function (err, data) {
// consume data here
})
}())
API
#on('readable' function () {})
#on('end' function () {})
Note: No end event will be emmited when error is emitted
#on('error' function (err) {})
#on('nodeName' function (err) {})
//if you are interested to listen on the "nodeName" instead of "data"#stop()
pauses#resume()
resumes#read()
returns object if stream is readable
Available Constructor Options
resourcePath
:Type: String
Optional field. Used to extract the XML nodes that you are interested in.// Ex: let the XML be ```xml <?xml version="1.0" encoding="utf-8"?> <items> <item id="1" test= 'hello'> <subitem sub= "TESTING SUB">one</subitem> <subitem sub= "2">two</subitem> </item> <item id="2"> <subitem>three</subitem> <subitem>four</subitem> <subitem>five</subitem> </item> </items> ``` if you are interested in `item` nodes then resourcePath would be: `/items/item` if you are interested in `subitem` nodes then resourcePath would be: `/items/item/subitem` if you are interested in `items` nodes then resourcePath would be: `/items`
emitOnNodeName
:Type: Boolean
Optional field. Set this to true if you want to listen on node names instead of data event.default: false
// Ex: consider the above XML snippet ```javascript if you are interested in `item` nodes. You can listen for `data` event by default to get those nodes in JS object form parser.on('data', function (data) { // item nodes as javascipt objects }) or else you can set `emitOnNodeName: true` and listen on node names like parser.on('item', function (data) { // item nodes as javascipt objects }) ``` `NOTE:` when you set `emitOnNodeName:true` "data" events are emitted normally. So make sure you don't listen for both the events.
attrsKey
:Type: String
Optional field. pass the value with which you want to reference attributes of a node in its object form.default: '