0001"""ElementTree extensions."""
0002
0003__revision__ = "$Rev$"
0004__date__ = "$Date: 2005-02-16 15:43:38 -0500 (Wed, 16 Feb 2005) $"
0005__author__ = "Ryan Tomayko (rtomayko@gmail.com)"
0006__copyright__ = "Copyright 2004-2005, Ryan Tomayko"
0007__license__ = "MIT <http://www.opensource.org/licenses/mit-license.php>"
0008
0009import os
0010
0011# If allowed and possible, import all objects from CElementTree:
0012
0013try:
0014    if os.environ.get('KID_NOCET'):
0015        raise ImportError
0016    else:
0017        try:
0018            if os.environ.get('KID_NOET'):
0019                raise ImportError
0020            else:
0021                import cElementTree as CET
0022                from cElementTree import *
0023        except ImportError:
0024            # you must have Python 2.5 or newer
0025            import xml.etree.cElementTree as CET
0026            from xml.etree.cElementTree import *
0027except:
0028    CET = None
0029
0030# Otherwise, import all objects from ElementTree:
0031
0032try:
0033    if os.environ.get('KID_NOET'):
0034        raise ImportError
0035    else:
0036        import elementtree.ElementTree as ET
0037        if not CET:
0038            from elementtree.ElementTree import *
0039except ImportError:
0040    # you must have Python 2.5 or newer
0041    import xml.etree.ElementTree as ET
0042    if not CET:
0043        from xml.etree.ElementTree import *
0044
0045# These functions exist only in ET, not in CET:
0046
0047encode_entity = ET._encode_entity
0048raise_serialization_error = ET._raise_serialization_error
0049
0050def Comment(text=None):
0051    elem = Element(Comment)
0052    elem.text = text
0053    return elem
0054
0055def ProcessingInstruction(target, text=None):
0056    element = Element(ProcessingInstruction)
0057    element.text = target
0058    if text:
0059        element.text = element.text + " " + text
0060    return element
0061
0062# The fragment factory does not exist in ElementTree:
0063
0064def Fragment(text=''):
0065    """XML fragment factory.
0066
0067    Fragments hold TEXT and children but do not have a tag or attributes.
0068
0069    """
0070    elem = Element(Fragment)
0071    elem.text = text
0072    return elem
0073
0074def namespaces(elem, remove=0):
0075    """Get the namespace declarations for an Element.
0076
0077    This function looks for attributes on the Element provided that have the
0078    following characteristics:
0079
0080       * Begin with 'xmlns:' and have no namespace URI.
0081       * Are named 'xmlns' and have no namespace URI.
0082
0083    The result is a dictionary containing namespace prefix -> URI mappings.
0084    Default namespace attributes result in a key of ''.
0085
0086    If remove is truthful, namespace declaration attributes are removed
0087    from the passed in Element.
0088
0089    """
0090    names = {}
0091    for k in elem.keys():
0092        if k.startswith('xmlns:'):
0093            names[k[6:]] = elem.get(k)
0094            if remove: del elem.attrib[k]
0095        elif k == 'xmlns':
0096            names[''] = elem.get(k)
0097            if remove: del elem.attrib[k]
0098    return names
0099
0100__all__ = ['Element', 'SubElement', 'Comment', 'ProcessingInstruction',
0101           'Fragment', 'ElementTree', 'QName', 'dump',
0102           'parse', 'tostring', 'namespaces',
0103           'encode_entity', 'raise_serialization_error']