1.1 --- a/libxml2dom/__init__.py Mon May 16 13:54:06 2005 +0000
1.2 +++ b/libxml2dom/__init__.py Tue May 17 14:43:19 2005 +0000
1.3 @@ -62,7 +62,7 @@
1.4 pass
1.5
1.6 def values(self):
1.7 - return [Node(_node, self.node.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()]
1.8 + return [Attribute(_node, self.node.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()]
1.9
1.10 def keys(self):
1.11 return [(attr.namespaceURI, attr.localName) for attr in self.values()]
1.12 @@ -146,7 +146,7 @@
1.13 return Node_localName(self._node)
1.14
1.15 def _parentNode(self):
1.16 - return Node(Node_parentNode(self._node), self.ownerDocument)
1.17 + return get_node(Node_parentNode(self._node), self)
1.18
1.19 def _previousSibling(self):
1.20 return Node(Node_previousSibling(self._node), self.ownerDocument)
1.21 @@ -167,10 +167,10 @@
1.22 return Node_getAttribute(self._node, name)
1.23
1.24 def getAttributeNodeNS(self, ns, localName):
1.25 - return Node(Node_getAttributeNodeNS(self._node, ns, localName), self.ownerDocument)
1.26 + return Attribute(Node_getAttributeNodeNS(self._node, ns, localName), self.ownerDocument)
1.27
1.28 def getAttributeNode(self, localName):
1.29 - return Node(Node_getAttributeNode(self._node, localName), self.ownerDocument)
1.30 + return Attribute(Node_getAttributeNode(self._node, localName), self.ownerDocument)
1.31
1.32 def setAttributeNS(self, ns, name, value):
1.33 Node_setAttributeNS(self._node, ns, name, value)
1.34 @@ -179,10 +179,10 @@
1.35 Node_setAttribute(self._node, name, value)
1.36
1.37 def setAttributeNodeNS(self, node):
1.38 - Node_setAttributeNodeNS(self._node, node)
1.39 + Node_setAttributeNodeNS(self._node, node._node)
1.40
1.41 def setAttributeNode(self, node):
1.42 - Node_setAttributeNode(self._node, node)
1.43 + Node_setAttributeNode(self._node, node._node)
1.44
1.45 def createElementNS(self, ns, name):
1.46 return Node(Node_createElementNS(self._node, ns, name), self.ownerDocument)
1.47 @@ -190,11 +190,13 @@
1.48 def createElement(self, name):
1.49 return Node(Node_createElement(self._node, name), self.ownerDocument)
1.50
1.51 - #def createAttributeNS(self, ns, name):
1.52 - # return Node(Node_createAttributeNS(self._node, ns, name))
1.53 + def createAttributeNS(self, ns, name):
1.54 + tmp = self.createElement("tmp")
1.55 + return Attribute(Node_createAttributeNS(tmp._node, ns, name))
1.56
1.57 - #def createAttribute(self, name):
1.58 - # return Node(Node_createAttribute(self._node, name))
1.59 + def createAttribute(self, name):
1.60 + tmp = self.createElement("tmp")
1.61 + return Attribute(Node_createAttribute(tmp._node, name))
1.62
1.63 def createTextNode(self, value):
1.64 return Node(Node_createTextNode(self._node, value), self.ownerDocument)
1.65 @@ -239,7 +241,7 @@
1.66 namespaceURI = property(_namespaceURI)
1.67 prefix = property(_prefix)
1.68 localName = property(_localName)
1.69 - ownerElement = parentNode = property(_parentNode)
1.70 + parentNode = property(_parentNode)
1.71 nodeType = property(_nodeType)
1.72 attributes = property(_attributes)
1.73 previousSibling = property(_previousSibling)
1.74 @@ -260,7 +262,7 @@
1.75 def xpath(self, expr, variables=None, namespaces=None):
1.76 result = Node_xpath(self._node, expr, variables, namespaces)
1.77 if hasattr(result, "__len__"):
1.78 - return NodeList([Node(_node, self.ownerDocument) for _node in result])
1.79 + return NodeList([get_node(_node, self) for _node in result])
1.80 else:
1.81 return result
1.82
1.83 @@ -275,6 +277,21 @@
1.84 def toFile(self, f, encoding=None):
1.85 toFile(self, f, encoding)
1.86
1.87 +# Attribute nodes.
1.88 +
1.89 +class Attribute(Node):
1.90 +
1.91 + "A class providing attribute access."
1.92 +
1.93 + def __init__(self, node, ownerDocument=None, ownerElement=None):
1.94 + Node.__init__(self, node, ownerDocument)
1.95 + self.ownerElement = ownerElement
1.96 +
1.97 + def _parentNode(self):
1.98 + return self.ownerElement
1.99 +
1.100 + parentNode = property(_parentNode)
1.101 +
1.102 # Document housekeeping mechanisms.
1.103
1.104 class Document(Node):
1.105 @@ -294,6 +311,16 @@
1.106
1.107 ownerDocument = property(_ownerDocument)
1.108
1.109 +# Factory functions.
1.110 +
1.111 +def get_node(_node, context_node):
1.112 + if Node_nodeType(_node) == context_node.DOCUMENT_NODE:
1.113 + return context_node.ownerDocument
1.114 + elif Node_nodeType(_node) == context_node.ATTRIBUTE_NODE:
1.115 + return Attribute(_node, context_node.ownerDocument, context_node)
1.116 + else:
1.117 + return Node(_node, context_node.ownerDocument)
1.118 +
1.119 # Utility functions.
1.120
1.121 def createDocumentType(localName, publicId, systemId):