1 #!/usr/bin/env python 2 3 """ 4 DOM wrapper around libxml2. 5 """ 6 7 import xml.dom 8 9 class Attribute(object): 10 11 def __init__(self, node): 12 self._node = node 13 14 class Node(object): 15 16 _nodeTypes = { 17 "attribute" : xml.dom.Node.ATTRIBUTE_NODE, 18 "comment" : xml.dom.Node.COMMENT_NODE, 19 "document_xml" : xml.dom.Node.DOCUMENT_NODE, 20 "doctype" : xml.dom.Node.DOCUMENT_TYPE_NODE, 21 "element" : xml.dom.Node.ELEMENT_NODE, 22 "entity" : xml.dom.Node.ENTITY_NODE, 23 "entity_ref" : xml.dom.Node.ENTITY_REFERENCE_NODE, 24 "notation" : xml.dom.Node.NOTATION_NODE, 25 "pi" : xml.dom.Node.PROCESSING_INSTRUCTION_NODE, 26 "text" : xml.dom.Node.TEXT_NODE 27 } 28 29 def __init__(self, node): 30 self._node = node 31 32 def _ownerDocument(self): 33 return self._node.doc 34 35 def _nodeType(self): 36 return self._nodeTypes[self._node.type] 37 38 def _childNodes(self): 39 child_nodes = [] 40 child_node = self._node.children 41 while child_node is not None: 42 child_nodes.append( 43 self.__class__(child_node)) 44 child_node = child_node.next 45 return child_nodes 46 47 def _attributes(self): 48 attributes = [] 49 attribute = self._node.properties 50 while attribute is not None: 51 attributes.append( 52 Attribute(attribute)) 53 attribute = attribute.next 54 return attributes 55 56 def _tagName(self): 57 if self._node.type == "element": 58 return self._node.name 59 else: 60 return None 61 62 def _namespaceURI(self): 63 if self._node.type == "element": 64 return self._node.ns().content 65 else: 66 return None 67 68 nodeType = property(_nodeType) 69 ownerDocument = property(_ownerDocument) 70 childNodes = property(_childNodes) 71 attributes = property(_attributes) 72 tagName = property(_tagName) 73 namespaceURI = property(_namespaceURI) 74 75 # vim: tabstop=4 expandtab shiftwidth=4