# HG changeset patch # User paulb # Date 1116340999 0 # Node ID 782e891cf656cd5e75f23f7c403d9abb7609e646 # Parent bfa572d6bd0af953649f2411e0d7d8d63dd5d994 [project @ 2005-05-17 14:43:19 by paulb] Added a special attribute class along with proper instantiation of objects from XPath results and from certain operations. Re-added attribute creation. diff -r bfa572d6bd0a -r 782e891cf656 libxml2dom/__init__.py --- a/libxml2dom/__init__.py Mon May 16 13:54:06 2005 +0000 +++ b/libxml2dom/__init__.py Tue May 17 14:43:19 2005 +0000 @@ -62,7 +62,7 @@ pass def values(self): - return [Node(_node, self.node.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()] + return [Attribute(_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()] @@ -146,7 +146,7 @@ return Node_localName(self._node) def _parentNode(self): - return Node(Node_parentNode(self._node), self.ownerDocument) + return get_node(Node_parentNode(self._node), self) def _previousSibling(self): return Node(Node_previousSibling(self._node), self.ownerDocument) @@ -167,10 +167,10 @@ return Node_getAttribute(self._node, name) def getAttributeNodeNS(self, ns, localName): - return Node(Node_getAttributeNodeNS(self._node, ns, localName), self.ownerDocument) + return Attribute(Node_getAttributeNodeNS(self._node, ns, localName), self.ownerDocument) def getAttributeNode(self, localName): - return Node(Node_getAttributeNode(self._node, localName), self.ownerDocument) + return Attribute(Node_getAttributeNode(self._node, localName), self.ownerDocument) def setAttributeNS(self, ns, name, value): Node_setAttributeNS(self._node, ns, name, value) @@ -179,10 +179,10 @@ Node_setAttribute(self._node, name, value) def setAttributeNodeNS(self, node): - Node_setAttributeNodeNS(self._node, node) + Node_setAttributeNodeNS(self._node, node._node) def setAttributeNode(self, node): - Node_setAttributeNode(self._node, node) + Node_setAttributeNode(self._node, node._node) def createElementNS(self, ns, name): return Node(Node_createElementNS(self._node, ns, name), self.ownerDocument) @@ -190,11 +190,13 @@ def createElement(self, name): return Node(Node_createElement(self._node, name), self.ownerDocument) - #def createAttributeNS(self, ns, name): - # return Node(Node_createAttributeNS(self._node, ns, name)) + def createAttributeNS(self, ns, name): + tmp = self.createElement("tmp") + return Attribute(Node_createAttributeNS(tmp._node, ns, name)) - #def createAttribute(self, name): - # return Node(Node_createAttribute(self._node, name)) + def createAttribute(self, name): + tmp = self.createElement("tmp") + return Attribute(Node_createAttribute(tmp._node, name)) def createTextNode(self, value): return Node(Node_createTextNode(self._node, value), self.ownerDocument) @@ -239,7 +241,7 @@ namespaceURI = property(_namespaceURI) prefix = property(_prefix) localName = property(_localName) - ownerElement = parentNode = property(_parentNode) + parentNode = property(_parentNode) nodeType = property(_nodeType) attributes = property(_attributes) previousSibling = property(_previousSibling) @@ -260,7 +262,7 @@ def xpath(self, expr, variables=None, namespaces=None): result = Node_xpath(self._node, expr, variables, namespaces) if hasattr(result, "__len__"): - return NodeList([Node(_node, self.ownerDocument) for _node in result]) + return NodeList([get_node(_node, self) for _node in result]) else: return result @@ -275,6 +277,21 @@ def toFile(self, f, encoding=None): toFile(self, f, encoding) +# Attribute nodes. + +class Attribute(Node): + + "A class providing attribute access." + + def __init__(self, node, ownerDocument=None, ownerElement=None): + Node.__init__(self, node, ownerDocument) + self.ownerElement = ownerElement + + def _parentNode(self): + return self.ownerElement + + parentNode = property(_parentNode) + # Document housekeeping mechanisms. class Document(Node): @@ -294,6 +311,16 @@ ownerDocument = property(_ownerDocument) +# Factory functions. + +def get_node(_node, context_node): + if Node_nodeType(_node) == context_node.DOCUMENT_NODE: + return context_node.ownerDocument + elif Node_nodeType(_node) == context_node.ATTRIBUTE_NODE: + return Attribute(_node, context_node.ownerDocument, context_node) + else: + return Node(_node, context_node.ownerDocument) + # Utility functions. def createDocumentType(localName, publicId, systemId):