1.1 --- a/__init__.py Mon Oct 06 18:59:57 2003 +0000
1.2 +++ b/__init__.py Mon Oct 06 21:59:05 2003 +0000
1.3 @@ -6,6 +6,7 @@
1.4
1.5 import xml.dom
1.6 import libxml2
1.7 +import sys
1.8
1.9 # NOTE: Consider a generator instead.
1.10
1.11 @@ -89,6 +90,7 @@
1.12 "comment" : xml.dom.Node.COMMENT_NODE,
1.13 "document_xml" : xml.dom.Node.DOCUMENT_NODE,
1.14 "doctype" : xml.dom.Node.DOCUMENT_TYPE_NODE,
1.15 + "dtd" : xml.dom.Node.DOCUMENT_TYPE_NODE, # NOTE: Needs verifying.
1.16 "element" : xml.dom.Node.ELEMENT_NODE,
1.17 "entity" : xml.dom.Node.ENTITY_NODE,
1.18 "entity_ref" : xml.dom.Node.ENTITY_REFERENCE_NODE,
1.19 @@ -97,16 +99,13 @@
1.20 "text" : xml.dom.Node.TEXT_NODE
1.21 }
1.22
1.23 - def __init__(self, node, ownerElement=None):
1.24 + def __init__(self, node, ownerElement=None, doctype=None):
1.25 self._node = node
1.26 self.ownerElement = ownerElement
1.27 -
1.28 - # NOTE: Fix the doctype.
1.29 -
1.30 - self.doctype = None
1.31 + self.doctype = doctype
1.32
1.33 def _ownerDocument(self):
1.34 - return self._node.doc
1.35 + return Node(self._node.doc)
1.36
1.37 def _nodeType(self):
1.38 return self._nodeTypes[self._node.type]
1.39 @@ -173,11 +172,23 @@
1.40 else:
1.41 return Node(self._node.parent)
1.42
1.43 + def hasAttributeNS(self, ns, localName):
1.44 + return self._getAttributeNS(ns, localName) is not None
1.45 +
1.46 + def hasAttribute(self, name):
1.47 + return self._getAttribute(name) is not None
1.48 +
1.49 def getAttributeNS(self, ns, localName):
1.50 + return self._getAttributeNS(ns, localName) or ""
1.51 +
1.52 + def _getAttributeNS(self, ns, localName):
1.53 return self._node.nsProp(localName, ns)
1.54
1.55 def getAttribute(self, name):
1.56 - return self._node.prop(localName)
1.57 + return self._getAttribute(name) or ""
1.58 +
1.59 + def _getAttribute(self, name):
1.60 + return self._node.prop(name)
1.61
1.62 def getAttributeNodeNS(self, ns, localName):
1.63 return self.attributes[(ns, localName)]
1.64 @@ -188,8 +199,13 @@
1.65
1.66 def setAttributeNS(self, ns, name, value):
1.67 prefix, localName = _get_prefix_and_localName(name)
1.68 - if localName:
1.69 + if prefix is not None:
1.70 self._node.setNsProp(self._node.newNs(ns, prefix), localName, value)
1.71 + elif ns == self._node.ns().content:
1.72 + self._node.setNsProp(self._node.ns(), localName, value)
1.73 + else:
1.74 + # NOTE: Needs verifying: what should happen to the namespace?
1.75 + self._node.setNsProp(None, localName, value)
1.76
1.77 def setAttribute(self, name, value):
1.78 self._node.setProp(name, value)
1.79 @@ -204,10 +220,14 @@
1.80
1.81 def createElementNS(self, ns, name):
1.82 prefix, localName = _get_prefix_and_localName(name)
1.83 - return TemporaryNode(ns, name, xml.dom.Node.ELEMENT_NODE)
1.84 + _node = libxml2.newNode(localName)
1.85 + _ns = _node.newNs(ns, prefix)
1.86 + _node.setNs(_ns)
1.87 + return Node(_node)
1.88
1.89 def createElement(self, name):
1.90 - return TemporaryNode(None, name, xml.dom.Node.ELEMENT_NODE)
1.91 + _node = libxml2.newNode(localName)
1.92 + return Node(_node)
1.93
1.94 def createAttributeNS(self, ns, name):
1.95 prefix, localName = _get_prefix_and_localName(name)
1.96 @@ -220,30 +240,46 @@
1.97 return TemporaryText(self._node.doc.newDocText(value))
1.98
1.99 def _add_node(self, tmp):
1.100 - if tmp.ns is not None:
1.101 - if tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.102 - _child = self._node.newChild(None, tmp.localName, None)
1.103 - elif tmp.nodeType == xml.dom.Node.ATTRIBUTE_NODE:
1.104 + if tmp.nodeType == xml.dom.Node.ATTRIBUTE_NODE:
1.105 + if tmp.ns is not None:
1.106 _child = self._node.newNsProp(None, tmp.localName, None)
1.107 - else:
1.108 - _child = None
1.109 -
1.110 - if _child is not None:
1.111 _ns = _child.newNs(tmp.ns, tmp.prefix)
1.112 _child.setNs(_ns)
1.113 + else:
1.114 + _child = self._node.newProp(None, tmp.name, None)
1.115 else:
1.116 - if tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.117 - _child = self._node.newChild(None, tmp.name, None)
1.118 - elif tmp.nodeType == xml.dom.Node.ATTRIBUTE_NODE:
1.119 - _child = self._node.newProp(None, tmp.name, None)
1.120 - else:
1.121 - _child = None
1.122 + _child = None
1.123
1.124 return _child
1.125
1.126 + def importNode(self, node, deep):
1.127 +
1.128 + if node.nodeType == xml.dom.Node.ELEMENT_NODE:
1.129 + imported_element = self.ownerDocument.createElementNS(node.namespaceURI, node.tagName)
1.130 + for value in node.attributes.values():
1.131 + imported_element.setAttributeNS(value.namespaceURI, value.nodeName, value.nodeValue)
1.132 +
1.133 + if deep:
1.134 + for child in node.childNodes:
1.135 + imported_child = self.importNode(child, deep)
1.136 + if imported_child:
1.137 + imported_element.appendChild(imported_child)
1.138 +
1.139 + return imported_element
1.140 +
1.141 + elif node.nodeType == xml.dom.Node.TEXT_NODE:
1.142 + return self.ownerDocument.createTextNode(node.nodeValue)
1.143 +
1.144 + elif node.nodeType == xml.dom.Node.ATTRIBUTE_NODE:
1.145 + return self.ownerDocument.createAttributeNS(node.namespaceURI, node.name)
1.146 +
1.147 + raise ValueError, node.nodeType
1.148 +
1.149 def insertBefore(self, tmp, oldNode):
1.150 if tmp.nodeType == xml.dom.Node.TEXT_NODE:
1.151 _child = tmp._text
1.152 + elif tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.153 + _child = tmp._node
1.154 else:
1.155 _child = self._add_node(tmp)
1.156 _child.unlinkNode()
1.157 @@ -252,6 +288,8 @@
1.158 def replaceChild(self, tmp, oldNode):
1.159 if tmp.nodeType == xml.dom.Node.TEXT_NODE:
1.160 _child = tmp._text
1.161 + elif tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.162 + _child = tmp._node
1.163 else:
1.164 _child = self._add_node(tmp)
1.165 _child.unlinkNode()
1.166 @@ -260,6 +298,8 @@
1.167 def appendChild(self, tmp):
1.168 if tmp.nodeType == xml.dom.Node.TEXT_NODE:
1.169 _child = self._node.addChild(tmp._text)
1.170 + elif tmp.nodeType == xml.dom.Node.ELEMENT_NODE:
1.171 + _child = self._node.addChild(tmp._node)
1.172 else:
1.173 _child = self._add_node(tmp)
1.174 return Node(_child)
1.175 @@ -284,4 +324,37 @@
1.176 def __eq__(self, other):
1.177 return self._node.nodePath() == other._node.nodePath()
1.178
1.179 +# Utility functions.
1.180 +
1.181 +def createDocumentType(localName, publicId, systemId):
1.182 + return None
1.183 +
1.184 +def createDocument(namespaceURI, localName, doctype):
1.185 + # NOTE: Fixed to use version 1.0 only.
1.186 + d = Node(libxml2.newDoc("1.0"), doctype=doctype)
1.187 + if localName is not None:
1.188 + root = d.createElementNS(namespaceURI, localName)
1.189 + d.appendChild(root)
1.190 + return d
1.191 +
1.192 +def parse(stream_or_string):
1.193 + if hasattr(stream_or_string, "read"):
1.194 + stream = stream_or_string
1.195 + else:
1.196 + stream = open(stream_or_string)
1.197 + return parseString(stream.read())
1.198 +
1.199 +def parseString(s):
1.200 + return Node(libxml2.parseDoc(s))
1.201 +
1.202 +def parseURI(uri):
1.203 + return Node(libxml2.parseURI(uri))
1.204 +
1.205 +def toString(node):
1.206 + return node._node.serialize()
1.207 +
1.208 +def toStream(node, stream=None):
1.209 + stream = stream or sys.stdout
1.210 + stream.write(toString(node))
1.211 +
1.212 # vim: tabstop=4 expandtab shiftwidth=4