Skip to content

Instantly share code, notes, and snippets.

@reusee
Created April 21, 2012 15:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reusee/2437960 to your computer and use it in GitHub Desktop.
Save reusee/2437960 to your computer and use it in GitHub Desktop.
xml dom accessor
from xml.dom.minidom import parseString
from xml.dom import Node
def parse(source):
dom = parseString(source)
return AccessProxy(dom)
class AccessProxy(object):
def __init__(self, dom):
self.dom = dom
def __getattr__(self, attr):
nodes = [AccessProxy(node)
for node in self.dom.getElementsByTagName(attr)]
if nodes:
return self.reduceNodes(nodes)
return getattr(self.dom, attr)
def reduceNodes(self, nodes):
if len(nodes) > 1:
return nodes
childs = nodes[0].childNodes
if len(childs) == 1:
if childs[0].nodeType == Node.TEXT_NODE:
return childs[0].nodeValue
return nodes[0]
def __str__(self):
return self.dom.toprettyxml()
def test():
'''
>>> source = """
... <members>
... <member><name>a</name></member>
... <member><name>b</name></member>
... </members>"""
>>> members = parse(source)
>>> len(members.member)
2
>>> members.member[0].name
u'a'
>>> members.member[1].name
u'b'
'''
pass
if __name__ == '__main__':
import doctest
doctest.testmod()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment