#!/usr/bin/env python

import StringIO
from lxml import etree

ns = 'http://www.example.org/'

def main ():
    a = StringIO.StringIO('<foo xmlns="%s"></foo>' % ns)
    tree = etree.parse(a)
    root = tree.getroot()
    printNSInfo(tree, 'Initial document.')
    # Add element using nsmap.
    etree.SubElement(root, 'm:bar', nsmap={'m': ns})
    printNSInfo(tree, "Added element using: etree.SubElement(root, 'm:bar', nsmap={'m': ns})")
    # Add element using {}.
    etree.SubElement(root, '{%s}bar' % ns)
    printNSInfo(tree, "Added element using: etree.SubElement(root, '{%s}bar' % ns)")
    # Add element with no namespace.
    etree.SubElement(root, 'bar')
    printNSInfo(tree, "Added element using: etree.SubElement(root, 'bar')")
    # Now sanity check and re-parse the output.
    output = StringIO.StringIO()
    tree.write_c14n(output)
    tree2 = etree.parse(output)
    printNSInfo(tree2, 'Re-parsed document containing added subelements.')
    
def printNSInfo (tree, msg):
    output = StringIO.StringIO()
    tree.write_c14n(output)
    print msg
    print output.getvalue()
    print '# of bar elements in no namespace: %d' % len(tree.xpath('//bar'))
    print '# of bar elements in %s namespace: %s\n' % \
          (ns, len(tree.xpath('//a:bar', {'a': ns})))

if __name__ == '__main__':
    main()
