# HG changeset patch # User paulb # Date 1116251628 0 # Node ID 861b2a08a959f3c96a982108c445ee8404850414 # Parent cf38bd9fb49b2de1388785abf37f8562e4bfc2cf [project @ 2005-05-16 13:53:48 by paulb] Fixed ownerDocument usage in NamedNodeMap. Added NodeList support. Added setting of nodeValue, value and data. Removed attribute creation for now - libxml2 doesn't support "live" attribute nodes very well. diff -r cf38bd9fb49b -r 861b2a08a959 libxml2dom/__init__.py --- a/libxml2dom/__init__.py Sun May 15 22:08:03 2005 +0000 +++ b/libxml2dom/__init__.py Mon May 16 13:53:48 2005 +0000 @@ -16,7 +16,7 @@ toFile as Node_toFile import weakref -# NOTE: Consider a generator instead. +# Attribute and node list wrappers. class NamedNodeMap(object): @@ -35,10 +35,18 @@ return self.node.getAttributeNodeNS(ns, localName) def setNamedItem(self, node): - self.node.setAttributeNode(node.name, node) + self.node.setAttributeNode(node) + # NOTE: Non-standard return of attribute node, since the actual node is + # NOTE: not set on the target node. + return self.getNamedItem(node.name) def setNamedItemNS(self, node): - self.node.setAttributeNodeNS(node.namespaceURI, node.localName, node) + self.node.setAttributeNodeNS(node) + # NOTE: Non-standard return of attribute node, since the actual node is + # NOTE: not set on the target node. + return self.getNamedItemNS(node.namespaceURI, node.name) + + # Dictionary emulation methods. def __getitem__(self, name): return self.getNamedItem(name) @@ -54,7 +62,7 @@ pass def values(self): - return [Node(_node, self.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()] + return [Node(_node, self.node.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()] def keys(self): return [(attr.namespaceURI, attr.localName) for attr in self.values()] @@ -68,6 +76,18 @@ def __str__(self): return "{%s}" % ",\n".join(["%s : %s" % (repr(key), repr(value)) for key, value in self.items()]) +class NodeList(list): + + "A wrapper around node lists." + + def item(self, index): + return self[index] + + def length(self): + return len(self) + +# Node classes. + class Node(object): """ @@ -99,7 +119,7 @@ # NOTE: Consider a generator instead. - return [Node(_node, self.ownerDocument) for _node in Node_childNodes(self._node)] + return NodeList([Node(_node, self.ownerDocument) for _node in Node_childNodes(self._node)]) def _attributes(self): return NamedNodeMap(self) @@ -110,6 +130,9 @@ def _nodeValue(self): return Node_nodeValue(self._node) + def _setNodeValue(self, value): + Node_setNodeValue(self._node, value) + def _prefix(self): return Node_prefix(self._node) @@ -155,11 +178,11 @@ def setAttribute(self, name, value): Node_setAttribute(self._node, name, value) - def setAttributeNodeNS(self, ns, name, node): - Node_setAttributeNodeNS(self._node, ns, name, node) + def setAttributeNodeNS(self, node): + Node_setAttributeNodeNS(self._node, node) - def setAttributeNode(self, name, node): - Node_setAttributeNode(self._node, name, node) + def setAttributeNode(self, node): + Node_setAttributeNode(self._node, node) def createElementNS(self, ns, name): return Node(Node_createElementNS(self._node, ns, name), self.ownerDocument) @@ -167,13 +190,11 @@ def createElement(self, name): return Node(Node_createElement(self._node, name), self.ownerDocument) - def createAttributeNS(self, ns, name): - # Returns a special temporary node. - return Node_createAttributeNS(self._node, ns, name) + #def createAttributeNS(self, ns, name): + # return Node(Node_createAttributeNS(self._node, ns, name)) - def createAttribute(self, name): - # Returns a special temporary node. - return Node_createAttribute(self._node, name) + #def createAttribute(self, name): + # return Node(Node_createAttribute(self._node, name)) def createTextNode(self, value): return Node(Node_createTextNode(self._node, value), self.ownerDocument) @@ -212,7 +233,7 @@ Node_removeChild(self._node, tmp) childNodes = property(_childNodes) - value = data = nodeValue = property(_nodeValue) + value = data = nodeValue = property(_nodeValue, _setNodeValue) name = nodeName = property(_nodeName) tagName = property(_tagName) namespaceURI = property(_namespaceURI) @@ -230,13 +251,16 @@ #def __eq__(self, other): # return self._node.nodePath() == other._node.nodePath() + def getElementsByTagName(self, tagName): + return self.xpath("//" + tagName) + # 4DOM extensions to the usual PyXML API. # NOTE: To be finished. def xpath(self, expr, variables=None, namespaces=None): result = Node_xpath(self._node, expr, variables, namespaces) if hasattr(result, "__len__"): - return [Node(_node, self.ownerDocument) for _node in result] + return NodeList([Node(_node, self.ownerDocument) for _node in result]) else: return result