--- /dev/null
+"""Read in a DOM instance, convert it to a Python object
+"""
+from xml.dom.utils import FileReader
+
+class PyObject: pass
+
+def pyobj_printer(py_obj, level=0):
+ """Return a "deep" string description of a Python object"""
+ from string import join, split
+ import types
+ descript = ''
+ for membname in dir(py_obj):
+ member = getattr(py_obj,membname)
+ if type(member) == types.InstanceType:
+ descript = descript + (' '*level) + '{'+membname+'}\n'
+ descript = descript + pyobj_printer(member, level+3)
+ elif type(member) == types.ListType:
+ descript = descript + (' '*level) + '['+membname+']\n'
+ for i in range(len(member)):
+ descript = descript+(' '*level)+str(i+1)+': '+ \
+ pyobj_printer(member[i],level+3)
+ else:
+ descript = descript + membname+'='
+ descript = descript + join(split(str(member)[:50]))+'...\n'
+ return descript
+
+def pyobj_from_dom(dom_node):
+ """Converts a DOM tree to a "native" Python object"""
+ py_obj = PyObject()
+ py_obj.PCDATA = ''
+ for node in dom_node.get_childNodes():
+ if node.name == '#text':
+ py_obj.PCDATA = py_obj.PCDATA + node.value
+ elif hasattr(py_obj, node.name):
+ getattr(py_obj, node.name).append(pyobj_from_dom(node))
+ else:
+ setattr(py_obj, node.name, [pyobj_from_dom(node)])
+ return py_obj
+
+# Main test
+dom_obj = FileReader("sample_rspec.xml").document
+py_obj = pyobj_from_dom(dom_obj)
+if __name__ == "__main__":
+ print pyobj_printer(py_obj)
\ No newline at end of file