node-elementtree ==================== node-elementtree is a [Node.js](http://nodejs.org) XML parser and serializer based upon the [Python ElementTree v1.3](http://effbot.org/zone/element-index.htm) module. Installation ==================== $ npm install elementtree Using the library ==================== For the usage refer to the Python ElementTree library documentation - [http://effbot.org/zone/element-index.htm#usage](http://effbot.org/zone/element-index.htm#usage). Supported XPath expressions in `find`, `findall` and `findtext` methods are listed on [http://effbot.org/zone/element-xpath.htm](http://effbot.org/zone/element-xpath.htm). Example 1 – Creating An XML Document ==================== This example shows how to build a valid XML document that can be published to Atom Hopper. Atom Hopper is used internally as a bridge from products all the way to collecting revenue, called “Usage.” MaaS and other products send similar events to it every time user performs an action on a resource (e.g. creates,updates or deletes). Below is an example of leveraging the API to create a new XML document. ```javascript var et = require('elementtree'); var XML = et.XML; var ElementTree = et.ElementTree; var element = et.Element; var subElement = et.SubElement; var date, root, tenantId, serviceName, eventType, usageId, dataCenter, region, checks, resourceId, category, startTime, resourceName, etree, xml; date = new Date(); root = element('entry'); root.set('xmlns', 'http://www.w3.org/2005/Atom'); tenantId = subElement(root, 'TenantId'); tenantId.text = '12345'; serviceName = subElement(root, 'ServiceName'); serviceName.text = 'MaaS'; resourceId = subElement(root, 'ResourceID'); resourceId.text = 'enAAAA'; usageId = subElement(root, 'UsageID'); usageId.text = '550e8400-e29b-41d4-a716-446655440000'; eventType = subElement(root, 'EventType'); eventType.text = 'create'; category = subElement(root, 'category'); category.set('term', 'monitoring.entity.create'); dataCenter = subElement(root, 'DataCenter'); dataCenter.text = 'global'; region = subElement(root, 'Region'); region.text = 'global'; startTime = subElement(root, 'StartTime'); startTime.text = date; resourceName = subElement(root, 'ResourceName'); resourceName.text = 'entity'; etree = new ElementTree(root); xml = etree.write({'xml_declaration': false}); console.log(xml); ``` As you can see, both et.Element and et.SubElement are factory methods which return a new instance of Element and SubElement class, respectively. When you create a new element (tag) you can use set method to set an attribute. To set the tag value, assign a value to the .text attribute. This example would output a document that looks like this: ```xml 12345 MaaS enAAAA 550e8400-e29b-41d4-a716-446655440000 create global global Sun Apr 29 2012 16:37:32 GMT-0700 (PDT) entity ``` Example 2 – Parsing An XML Document ==================== This example shows how to parse an XML document and use simple XPath selectors. For demonstration purposes, we will use the XML document located at https://gist.github.com/2554343. Behind the scenes, node-elementtree uses Isaac’s sax library for parsing XML, but the library has a concept of “parsers,” which means it’s pretty simple to add support for a different parser. ```javascript var fs = require('fs'); var et = require('elementtree'); var XML = et.XML; var ElementTree = et.ElementTree; var element = et.Element; var subElement = et.SubElement; var data, etree; data = fs.readFileSync('document.xml').toString(); etree = et.parse(data); console.log(etree.findall('./entry/TenantId').length); // 2 console.log(etree.findtext('./entry/ServiceName')); // MaaS console.log(etree.findall('./entry/category')[0].get('term')); // monitoring.entity.create console.log(etree.findall('*/category/[@term="monitoring.entity.update"]').length); // 1 ``` Build status ==================== [![Build Status](https://secure.travis-ci.org/racker/node-elementtree.png)](http://travis-ci.org/racker/node-elementtree) License ==================== node-elementtree is distributed under the [Apache license](http://www.apache.org/licenses/LICENSE-2.0.html).