1.1 --- a/__init__.py Fri Jun 20 21:40:13 2008 +0200
1.2 +++ b/__init__.py Sun Oct 05 21:53:02 2003 +0000
1.3 @@ -5,11 +5,72 @@
1.4 """
1.5
1.6 import xml.dom
1.7 +import libxml2
1.8
1.9 -class Attribute(object):
1.10 +# NOTE: Consider a generator instead.
1.11 +
1.12 +class NamedNodeMap(object):
1.13
1.14 def __init__(self, node):
1.15 - self._node = node
1.16 + self.node = node
1.17 +
1.18 + def getNamedItem(self, name):
1.19 + pass
1.20 +
1.21 + def getNamedItemNS(self, ns, localName):
1.22 + pass
1.23 +
1.24 + def setNamedItem(self, node):
1.25 + pass
1.26 +
1.27 + def setNamedItemNS(self, node):
1.28 + pass
1.29 +
1.30 + def __getitem__(self, name):
1.31 + pass
1.32 +
1.33 + def __setitem__(self, name, node):
1.34 + pass
1.35 +
1.36 + def __delitem__(self, name):
1.37 + pass
1.38 +
1.39 + def values(self):
1.40 + attributes = []
1.41 + _attribute = self.node._node.properties
1.42 + while _attribute is not None:
1.43 + attributes.append(Node(_attribute, ownerElement=self.node))
1.44 + _attribute = _attribute.next
1.45 + return attributes
1.46 +
1.47 + def keys(self):
1.48 + return [(attr.namespaceURI, attr.localName) for attr in self.values()]
1.49 +
1.50 + def items(self):
1.51 + return [((attr.namespaceURI, attr.localName), attr) for attr in self.values()]
1.52 +
1.53 + def __repr__(self):
1.54 + return str(self)
1.55 +
1.56 + def __str__(self):
1.57 + return "{%s}" % ",\n".join(["%s : %s" % (repr(key), repr(value)) for key, value in self.items()])
1.58 +
1.59 +def _get_prefix_and_localName(name):
1.60 + t = name.split(":")
1.61 + if len(t) == 1:
1.62 + return None, name
1.63 + elif len(t) == 2:
1.64 + return t
1.65 + else:
1.66 + # NOTE: Should raise an exception.
1.67 + return None, None
1.68 +
1.69 +class TemporaryNode(object):
1.70 + def __init__(self, ns, name, nodeType):
1.71 + self.ns = ns
1.72 + self.name = name
1.73 + self.nodeType = nodeType
1.74 + self.prefix, self.localName = _get_prefix_and_localName(self.name)
1.75
1.76 class Node(object):
1.77
1.78 @@ -26,8 +87,9 @@
1.79 "text" : xml.dom.Node.TEXT_NODE
1.80 }
1.81
1.82 - def __init__(self, node):
1.83 + def __init__(self, node, ownerElement=None):
1.84 self._node = node
1.85 + self.ownerElement = ownerElement
1.86
1.87 def _ownerDocument(self):
1.88 return self._node.doc
1.89 @@ -36,6 +98,9 @@
1.90 return self._nodeTypes[self._node.type]
1.91
1.92 def _childNodes(self):
1.93 +
1.94 + # NOTE: Consider a generator instead.
1.95 +
1.96 child_nodes = []
1.97 child_node = self._node.children
1.98 while child_node is not None:
1.99 @@ -45,31 +110,149 @@
1.100 return child_nodes
1.101
1.102 def _attributes(self):
1.103 - attributes = []
1.104 - attribute = self._node.properties
1.105 - while attribute is not None:
1.106 - attributes.append(
1.107 - Attribute(attribute))
1.108 - attribute = attribute.next
1.109 - return attributes
1.110 + return NamedNodeMap(self)
1.111 +
1.112 + def _getNs(self):
1.113 +
1.114 + "Internal namespace information retrieval."
1.115 +
1.116 + try:
1.117 + return self._node.ns()
1.118 + except libxml2.treeError:
1.119 + return None
1.120 +
1.121 + def _namespaceURI(self):
1.122 + ns = self._getNs()
1.123 + if ns is not None:
1.124 + return ns.content
1.125 + else:
1.126 + return None
1.127 +
1.128 + def _nodeValue(self):
1.129 + return self._node.content
1.130 +
1.131 + def _prefix(self):
1.132 + ns = self._getNs()
1.133 + if ns is not None:
1.134 + return ns.name
1.135 + else:
1.136 + return None
1.137 +
1.138 + def _nodeName(self):
1.139 + prefix = self._prefix()
1.140 + if prefix is not None:
1.141 + return prefix + ":" + self._localName()
1.142 + else:
1.143 + return self._localName()
1.144
1.145 def _tagName(self):
1.146 if self._node.type == "element":
1.147 - return self._node.name
1.148 + return self._nodeName()
1.149 else:
1.150 return None
1.151
1.152 - def _namespaceURI(self):
1.153 - if self._node.type == "element":
1.154 - return self._node.ns().content
1.155 + def _localName(self):
1.156 + return self._node.name
1.157 +
1.158 + def _parentNode(self):
1.159 + return self._node.parent
1.160 +
1.161 + def getAttributeNS(self, ns, localName):
1.162 + return self._node.nsProp(localName, ns)
1.163 +
1.164 + def getAttribute(self, name):
1.165 + return self._node.prop(localName)
1.166 +
1.167 + def getAttributeNodeNS(self, ns, localName):
1.168 + return self.attributes[(ns, localName)]
1.169 +
1.170 + def getAttributeNode(self, localName):
1.171 + # NOTE: Needs verifying.
1.172 + return self.attributes[(None, localName)]
1.173 +
1.174 + def setAttributeNS(self, ns, name, value):
1.175 + prefix, localName = _get_prefix_and_localName(name)
1.176 + if localName:
1.177 + self._node.setNsProp(self._node.newNs(ns, prefix), localName, value)
1.178 +
1.179 + def setAttribute(self, name, value):
1.180 + self._node.setProp(name, value)
1.181 +
1.182 + def setAttributeNodeNS(self, ns, name, node):
1.183 + # NOTE: Not actually putting the node on the element.
1.184 + self.setAttributeNS(ns, name, node.nodeValue)
1.185 +
1.186 + def setAttributeNode(self, name, node):
1.187 + # NOTE: Not actually putting the node on the element.
1.188 + self.setAttribute(name, node.nodeValue)
1.189 +
1.190 + def createElementNS(self, ns, name):
1.191 + prefix, localName = _get_prefix_and_localName(name)
1.192 + return TemporaryNode(ns, name, xml.dom.Node.ELEMENT_NODE)
1.193 +
1.194 + def createElement(self, name):
1.195 + return TemporaryNode(None, name, xml.dom.Node.ELEMENT_NODE)
1.196 +
1.197 + def createAttributeNS(self, ns, name):
1.198 + prefix, localName = _get_prefix_and_localName(name)
1.199 + return TemporaryNode(ns, name, xml.dom.Node.ATTRIBUTE_NODE)
1.200 +
1.201 + def createAttribute(self, name):
1.202 + return TemporaryNode(ns, name, xml.dom.Node.ATTRIBUTE_NODE)
1.203 +
1.204 + def _add_node(self, tmp):
1.205 + if tmp.ns is not None:
1.206 + if tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.207 + _child = self._node.newChild(None, tmp.localName, None)
1.208 + elif tmp.nodeType == xml.dom.Node.ATTRIBUTE_NODE:
1.209 + _child = self._node.newNsProp(None, tmp.localName, None)
1.210 + else:
1.211 + _child = None
1.212 +
1.213 + if _child is not None:
1.214 + _ns = _child.newNs(tmp.ns, tmp.prefix)
1.215 + _child.setNs(_ns)
1.216 else:
1.217 - return None
1.218 + if tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.219 + _child = self._node.newChild(None, tmp.name, None)
1.220 + elif tmp.nodeType == xml.dom.Node.ATTRIBUTE_NODE:
1.221 + _child = self._node.newProp(None, tmp.name, None)
1.222 + else:
1.223 + _child = None
1.224 +
1.225 + return _child
1.226
1.227 - nodeType = property(_nodeType)
1.228 + def insertBefore(self, tmp, oldNode):
1.229 + _child = self._add_node(tmp)
1.230 + _child.unlinkNode()
1.231 + return Node(oldNode._node.addPrevSibling(_child))
1.232 +
1.233 + def replaceChild(self, tmp, oldNode):
1.234 + _child = self._add_node(tmp)
1.235 + _child.unlinkNode()
1.236 + return Node(oldNode._node.replaceNode(_child))
1.237 +
1.238 + def appendChild(self, tmp):
1.239 + return Node(self._add_node(tmp))
1.240 +
1.241 + #doctype = property(_doctype)
1.242 + #ownerElement = property(_ownerElement)
1.243 ownerDocument = property(_ownerDocument)
1.244 childNodes = property(_childNodes)
1.245 - attributes = property(_attributes)
1.246 + value = data = nodeValue = property(_nodeValue)
1.247 + name = nodeName = property(_nodeName)
1.248 tagName = property(_tagName)
1.249 namespaceURI = property(_namespaceURI)
1.250 + prefix = property(_prefix)
1.251 + localName = property(_localName)
1.252 + parentNode = property(_parentNode)
1.253 + nodeType = property(_nodeType)
1.254 + attributes = property(_attributes)
1.255 +
1.256 + def isSameNode(self, other):
1.257 + return self._node.nodePath() == other._node.nodePath()
1.258 +
1.259 + def __eq__(self, other):
1.260 + return self._node.nodePath() == other._node.nodePath()
1.261
1.262 # vim: tabstop=4 expandtab shiftwidth=4