#!/usr/bin/env python # # Small XML DOM viewer # 2006-03-17 Thomas Strathmann # import wx from sys import argv, exit, stderr import xml.dom.minidom from urllib import urlopen class TreeWindow(wx.Frame): def __init__(self, parent, title, dom): wx.Frame.__init__(self, parent, wx.ID_ANY, title) self.tree = wx.TreeCtrl(self) root = self.tree.AddRoot(title) data = wx.TreeItemData(dom) self.tree.SetPyData(root, data) self.addNodes(root, dom.childNodes) self.tree.Expand(root) self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.onItemActive, self.tree) self.Show() def onItemActive(self, event): #print self.tree.GetPyData(event.GetItem()).GetData() event.Skip() def addNodes(self, root, nodes): for n in nodes: if n.nodeType == n.TEXT_NODE: if not n.nodeValue.isspace(): node = self.tree.AppendItem(root, self.formatText(n.nodeValue)) self.addNodeData(node, n) elif n.nodeType == n.ELEMENT_NODE: node = self.tree.AppendItem(root, '<'+n.nodeName+'>') self.addNodeData(node, n) self.addAttributes(node, n) self.addNodes(node, n.childNodes) def addAttributes(self, root, node): if node.hasAttributes: attribs = node.attributes for i in range(attribs.length): attr = attribs.item(i) label = attr.name+'="'+node.getAttribute(attr.name)+'"' n = self.tree.AppendItem(root, label) self.addNodeData(n, attr) def addNodeData(self, node, pydata): data = wx.TreeItemData(pydata) self.tree.SetPyData(node, data) def formatText(self, text): return text.strip().replace('\n', ' ').replace('\r', ' ').replace('\t', ' ') if __name__ == '__main__': if len(argv) < 2: stderr.write("usage: %s FILE|URL\n" % argv[0]) exit(1) try: app = wx.PySimpleApp() dom = xml.dom.minidom.parseString(urlopen(argv[1]).read()) frame = TreeWindow(None, argv[1], dom) app.MainLoop() except IOError: stderr.write("could not retrieve source file\n") except xml.parsers.expat.ExpatError: stderr.write("could not parse source\n")