1.1 --- a/libxml2dom/__init__.py Sun May 15 22:08:03 2005 +0000
1.2 +++ b/libxml2dom/__init__.py Mon May 16 13:53:48 2005 +0000
1.3 @@ -16,7 +16,7 @@
1.4 toFile as Node_toFile
1.5 import weakref
1.6
1.7 -# NOTE: Consider a generator instead.
1.8 +# Attribute and node list wrappers.
1.9
1.10 class NamedNodeMap(object):
1.11
1.12 @@ -35,10 +35,18 @@
1.13 return self.node.getAttributeNodeNS(ns, localName)
1.14
1.15 def setNamedItem(self, node):
1.16 - self.node.setAttributeNode(node.name, node)
1.17 + self.node.setAttributeNode(node)
1.18 + # NOTE: Non-standard return of attribute node, since the actual node is
1.19 + # NOTE: not set on the target node.
1.20 + return self.getNamedItem(node.name)
1.21
1.22 def setNamedItemNS(self, node):
1.23 - self.node.setAttributeNodeNS(node.namespaceURI, node.localName, node)
1.24 + self.node.setAttributeNodeNS(node)
1.25 + # NOTE: Non-standard return of attribute node, since the actual node is
1.26 + # NOTE: not set on the target node.
1.27 + return self.getNamedItemNS(node.namespaceURI, node.name)
1.28 +
1.29 + # Dictionary emulation methods.
1.30
1.31 def __getitem__(self, name):
1.32 return self.getNamedItem(name)
1.33 @@ -54,7 +62,7 @@
1.34 pass
1.35
1.36 def values(self):
1.37 - return [Node(_node, self.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()]
1.38 + return [Node(_node, self.node.ownerDocument) for _node in Node_attributes(self.node.as_native_node()).values()]
1.39
1.40 def keys(self):
1.41 return [(attr.namespaceURI, attr.localName) for attr in self.values()]
1.42 @@ -68,6 +76,18 @@
1.43 def __str__(self):
1.44 return "{%s}" % ",\n".join(["%s : %s" % (repr(key), repr(value)) for key, value in self.items()])
1.45
1.46 +class NodeList(list):
1.47 +
1.48 + "A wrapper around node lists."
1.49 +
1.50 + def item(self, index):
1.51 + return self[index]
1.52 +
1.53 + def length(self):
1.54 + return len(self)
1.55 +
1.56 +# Node classes.
1.57 +
1.58 class Node(object):
1.59
1.60 """
1.61 @@ -99,7 +119,7 @@
1.62
1.63 # NOTE: Consider a generator instead.
1.64
1.65 - return [Node(_node, self.ownerDocument) for _node in Node_childNodes(self._node)]
1.66 + return NodeList([Node(_node, self.ownerDocument) for _node in Node_childNodes(self._node)])
1.67
1.68 def _attributes(self):
1.69 return NamedNodeMap(self)
1.70 @@ -110,6 +130,9 @@
1.71 def _nodeValue(self):
1.72 return Node_nodeValue(self._node)
1.73
1.74 + def _setNodeValue(self, value):
1.75 + Node_setNodeValue(self._node, value)
1.76 +
1.77 def _prefix(self):
1.78 return Node_prefix(self._node)
1.79
1.80 @@ -155,11 +178,11 @@
1.81 def setAttribute(self, name, value):
1.82 Node_setAttribute(self._node, name, value)
1.83
1.84 - def setAttributeNodeNS(self, ns, name, node):
1.85 - Node_setAttributeNodeNS(self._node, ns, name, node)
1.86 + def setAttributeNodeNS(self, node):
1.87 + Node_setAttributeNodeNS(self._node, node)
1.88
1.89 - def setAttributeNode(self, name, node):
1.90 - Node_setAttributeNode(self._node, name, node)
1.91 + def setAttributeNode(self, node):
1.92 + Node_setAttributeNode(self._node, node)
1.93
1.94 def createElementNS(self, ns, name):
1.95 return Node(Node_createElementNS(self._node, ns, name), self.ownerDocument)
1.96 @@ -167,13 +190,11 @@
1.97 def createElement(self, name):
1.98 return Node(Node_createElement(self._node, name), self.ownerDocument)
1.99
1.100 - def createAttributeNS(self, ns, name):
1.101 - # Returns a special temporary node.
1.102 - return Node_createAttributeNS(self._node, ns, name)
1.103 + #def createAttributeNS(self, ns, name):
1.104 + # return Node(Node_createAttributeNS(self._node, ns, name))
1.105
1.106 - def createAttribute(self, name):
1.107 - # Returns a special temporary node.
1.108 - return Node_createAttribute(self._node, name)
1.109 + #def createAttribute(self, name):
1.110 + # return Node(Node_createAttribute(self._node, name))
1.111
1.112 def createTextNode(self, value):
1.113 return Node(Node_createTextNode(self._node, value), self.ownerDocument)
1.114 @@ -212,7 +233,7 @@
1.115 Node_removeChild(self._node, tmp)
1.116
1.117 childNodes = property(_childNodes)
1.118 - value = data = nodeValue = property(_nodeValue)
1.119 + value = data = nodeValue = property(_nodeValue, _setNodeValue)
1.120 name = nodeName = property(_nodeName)
1.121 tagName = property(_tagName)
1.122 namespaceURI = property(_namespaceURI)
1.123 @@ -230,13 +251,16 @@
1.124 #def __eq__(self, other):
1.125 # return self._node.nodePath() == other._node.nodePath()
1.126
1.127 + def getElementsByTagName(self, tagName):
1.128 + return self.xpath("//" + tagName)
1.129 +
1.130 # 4DOM extensions to the usual PyXML API.
1.131 # NOTE: To be finished.
1.132
1.133 def xpath(self, expr, variables=None, namespaces=None):
1.134 result = Node_xpath(self._node, expr, variables, namespaces)
1.135 if hasattr(result, "__len__"):
1.136 - return [Node(_node, self.ownerDocument) for _node in result]
1.137 + return NodeList([Node(_node, self.ownerDocument) for _node in result])
1.138 else:
1.139 return result
1.140