Skip to content
Roman Shtylman edited this page Jan 3, 2013 · 23 revisions

Libxmljs

LibXML bindings for node.js

var libxmljs = require("libxmljs");
var xml =  '<?xml version="1.0" encoding="UTF-8"?>' +
           '<root>' +
               '<child foo="bar">' +
                   '<grandchild baz="fizbuzz">grandchild content</grandchild>' +
               '</child>' +
               '<sibling>with content!</sibling>' +
           '</root>';

var xmlDoc = libxmljs.parseXmlString(xml);

// xpath queries
var gchild = xmlDoc.get('//grandchild');

console.log(gchild.text());  // prints "grandchild content"

var children = xmlDoc.root().childNodes();
var child = children[0];

console.log(child.attr('foo').value()); // prints "bar"

Examples

Parsing

var doc = libxml.parseXmlString([xmlString]);

SAX Parsing

SAX parsing objects are event emitters and callbacks can be connected in typical node.js fashion.

var parser = new libxml.SaxParser();

parser.on('startDocument', ...);
parser.on('startElement', ...);

// parse a complete document
parser.parseString([xmlString]);

SAX Push Parsing

Push parsers are created the same way DOM parsers are, but take input a chunk at a time:

var parser = new libxml.SaxPushParser();

// connect any callbacks here
parser
  .on('startDocument', ...)
  .on('startElement', ...)

while(xmlChunk) {
  parser.push(xmlChunk);
}

Builder

To build an XML document simply create all the required nodes (indentation is meant to represent location in the tree, you can capture any intermediate variable to reuse):

var doc = new libxml.Document();
  doc.node('root')
    .node('child').attr({foo: 'bar'})
      .node('grandchild', 'grandchild content').attr({baz: 'fizbuzz'})
    .parent()
  .parent()
    .node('sibling', 'with content!');

Calling doc.toString() will yield the following XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <child foo="bar">
        <grandchild baz="fizbuzz">grandchild content</grandchild>
    </child>
    <sibling>with content!</sibling>
</root>

Clone this wiki locally