| 
									
										
										
										
											2006-07-29 16:56:15 +00:00
										 |  |  | # test for xml.dom.minidom | 
					
						
							| 
									
										
										
										
											2000-07-03 16:37:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-24 20:42:55 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2000-07-03 16:37:42 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2003-01-25 22:02:52 +00:00
										 |  |  | import pickle | 
					
						
							|  |  |  | from StringIO import StringIO | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  | from test.test_support import verbose, run_unittest, TestSkipped | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2000-07-03 16:37:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-29 16:56:15 +00:00
										 |  |  | import xml.dom | 
					
						
							|  |  |  | import xml.dom.minidom | 
					
						
							|  |  |  | import xml.parsers.expat | 
					
						
							| 
									
										
										
										
											2002-07-19 22:16:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-29 16:56:15 +00:00
										 |  |  | from xml.dom.minidom import parse, Node, Document, parseString | 
					
						
							|  |  |  | from xml.dom.minidom import getDOMImplementation | 
					
						
							| 
									
										
										
										
											2003-01-25 22:02:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-19 22:16:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-03 16:37:42 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     base = sys.argv[0] | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     base = __file__ | 
					
						
							| 
									
										
										
										
											2001-10-24 20:42:55 +00:00
										 |  |  | tstfile = os.path.join(os.path.dirname(base), "test"+os.extsep+"xml") | 
					
						
							| 
									
										
										
										
											2000-07-03 16:37:42 +00:00
										 |  |  | del base | 
					
						
							| 
									
										
										
										
											2000-07-01 14:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-25 21:39:09 +00:00
										 |  |  | # The tests of DocumentType importing use these helpers to construct | 
					
						
							|  |  |  | # the documents to work with, since not all DOM builders actually | 
					
						
							|  |  |  | # create the DocumentType nodes. | 
					
						
							|  |  |  | def create_doc_without_doctype(doctype=None): | 
					
						
							|  |  |  |     return getDOMImplementation().createDocument(None, "doc", doctype) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def create_nonempty_doctype(): | 
					
						
							|  |  |  |     doctype = getDOMImplementation().createDocumentType("doc", None, None) | 
					
						
							|  |  |  |     doctype.entities._seq = [] | 
					
						
							|  |  |  |     doctype.notations._seq = [] | 
					
						
							| 
									
										
										
										
											2006-07-29 16:56:15 +00:00
										 |  |  |     notation = xml.dom.minidom.Notation("my-notation", None, | 
					
						
							|  |  |  |                                         "http://xml.python.org/notations/my") | 
					
						
							| 
									
										
										
										
											2003-01-25 21:39:09 +00:00
										 |  |  |     doctype.notations._seq.append(notation) | 
					
						
							| 
									
										
										
										
											2006-07-29 16:56:15 +00:00
										 |  |  |     entity = xml.dom.minidom.Entity("my-entity", None, | 
					
						
							|  |  |  |                                     "http://xml.python.org/entities/my", | 
					
						
							|  |  |  |                                     "my-notation") | 
					
						
							| 
									
										
										
										
											2003-01-25 21:39:09 +00:00
										 |  |  |     entity.version = "1.0" | 
					
						
							|  |  |  |     entity.encoding = "utf-8" | 
					
						
							|  |  |  |     entity.actualEncoding = "us-ascii" | 
					
						
							|  |  |  |     doctype.entities._seq.append(entity) | 
					
						
							|  |  |  |     return doctype | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def create_doc_with_doctype(): | 
					
						
							|  |  |  |     doctype = create_nonempty_doctype() | 
					
						
							|  |  |  |     doc = create_doc_without_doctype(doctype) | 
					
						
							|  |  |  |     doctype.entities.item(0).ownerDocument = doc | 
					
						
							|  |  |  |     doctype.notations.item(0).ownerDocument = doc | 
					
						
							|  |  |  |     return doc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  | class MinidomTest(unittest.TestCase): | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             Node.allnodes | 
					
						
							|  |  |  |         except AttributeError: | 
					
						
							|  |  |  |             # We don't actually have the minidom from the standard library, | 
					
						
							|  |  |  |             # but are picking up the PyXML version from site-packages. | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.confirm(len(Node.allnodes) == 0, | 
					
						
							|  |  |  |                     "assertion: len(Node.allnodes) == 0") | 
					
						
							|  |  |  |             if len(Node.allnodes): | 
					
						
							|  |  |  |                 print "Garbage left over:" | 
					
						
							|  |  |  |                 if verbose: | 
					
						
							|  |  |  |                     print Node.allnodes.items()[0:10] | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     # Don't print specific nodes if repeatable results | 
					
						
							|  |  |  |                     # are needed | 
					
						
							|  |  |  |                     print len(Node.allnodes) | 
					
						
							|  |  |  |             Node.allnodes = {} | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def confirm(self, test, testname = "Test"): | 
					
						
							|  |  |  |         self.assertTrue(test, testname) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def checkWholeText(self, node, s): | 
					
						
							|  |  |  |         t = node.wholeText | 
					
						
							|  |  |  |         self.confirm(t == s, "looking for %s, found %s" % (repr(s), repr(t))) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseFromFile(self): | 
					
						
							|  |  |  |         dom = parse(StringIO(open(tstfile).read())) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							|  |  |  |         self.confirm(isinstance(dom,Document)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetElementsByTagName(self): | 
					
						
							|  |  |  |         dom = parse(tstfile) | 
					
						
							|  |  |  |         self.confirm(dom.getElementsByTagName("LI") == \ | 
					
						
							|  |  |  |                 dom.documentElement.getElementsByTagName("LI")) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testInsertBefore(self): | 
					
						
							|  |  |  |         dom = parseString("<doc><foo/></doc>") | 
					
						
							|  |  |  |         root = dom.documentElement | 
					
						
							|  |  |  |         elem = root.childNodes[0] | 
					
						
							|  |  |  |         nelem = dom.createElement("element") | 
					
						
							|  |  |  |         root.insertBefore(nelem, elem) | 
					
						
							|  |  |  |         self.confirm(len(root.childNodes) == 2 | 
					
						
							|  |  |  |                 and root.childNodes.length == 2 | 
					
						
							|  |  |  |                 and root.childNodes[0] is nelem | 
					
						
							|  |  |  |                 and root.childNodes.item(0) is nelem | 
					
						
							|  |  |  |                 and root.childNodes[1] is elem | 
					
						
							|  |  |  |                 and root.childNodes.item(1) is elem | 
					
						
							|  |  |  |                 and root.firstChild is nelem | 
					
						
							|  |  |  |                 and root.lastChild is elem | 
					
						
							|  |  |  |                 and root.toxml() == "<doc><element/><foo/></doc>" | 
					
						
							|  |  |  |                 , "testInsertBefore -- node properly placed in tree") | 
					
						
							|  |  |  |         nelem = dom.createElement("element") | 
					
						
							|  |  |  |         root.insertBefore(nelem, None) | 
					
						
							|  |  |  |         self.confirm(len(root.childNodes) == 3 | 
					
						
							|  |  |  |                 and root.childNodes.length == 3 | 
					
						
							|  |  |  |                 and root.childNodes[1] is elem | 
					
						
							|  |  |  |                 and root.childNodes.item(1) is elem | 
					
						
							|  |  |  |                 and root.childNodes[2] is nelem | 
					
						
							|  |  |  |                 and root.childNodes.item(2) is nelem | 
					
						
							|  |  |  |                 and root.lastChild is nelem | 
					
						
							|  |  |  |                 and nelem.previousSibling is elem | 
					
						
							|  |  |  |                 and root.toxml() == "<doc><element/><foo/><element/></doc>" | 
					
						
							|  |  |  |                 , "testInsertBefore -- node properly placed in tree") | 
					
						
							|  |  |  |         nelem2 = dom.createElement("bar") | 
					
						
							|  |  |  |         root.insertBefore(nelem2, nelem) | 
					
						
							|  |  |  |         self.confirm(len(root.childNodes) == 4 | 
					
						
							|  |  |  |                 and root.childNodes.length == 4 | 
					
						
							|  |  |  |                 and root.childNodes[2] is nelem2 | 
					
						
							|  |  |  |                 and root.childNodes.item(2) is nelem2 | 
					
						
							|  |  |  |                 and root.childNodes[3] is nelem | 
					
						
							|  |  |  |                 and root.childNodes.item(3) is nelem | 
					
						
							|  |  |  |                 and nelem2.nextSibling is nelem | 
					
						
							|  |  |  |                 and nelem.previousSibling is nelem2 | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |                 and root.toxml() == | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                 "<doc><element/><foo/><bar/><element/></doc>" | 
					
						
							|  |  |  |                 , "testInsertBefore -- node properly placed in tree") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def _create_fragment_test_nodes(self): | 
					
						
							|  |  |  |         dom = parseString("<doc/>") | 
					
						
							|  |  |  |         orig = dom.createTextNode("original") | 
					
						
							|  |  |  |         c1 = dom.createTextNode("foo") | 
					
						
							|  |  |  |         c2 = dom.createTextNode("bar") | 
					
						
							|  |  |  |         c3 = dom.createTextNode("bat") | 
					
						
							|  |  |  |         dom.documentElement.appendChild(orig) | 
					
						
							|  |  |  |         frag = dom.createDocumentFragment() | 
					
						
							|  |  |  |         frag.appendChild(c1) | 
					
						
							|  |  |  |         frag.appendChild(c2) | 
					
						
							|  |  |  |         frag.appendChild(c3) | 
					
						
							|  |  |  |         return dom, orig, c1, c2, c3, frag | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testInsertBeforeFragment(self): | 
					
						
							|  |  |  |         dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes() | 
					
						
							|  |  |  |         dom.documentElement.insertBefore(frag, None) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.confirm(tuple(dom.documentElement.childNodes) == | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                      (orig, c1, c2, c3), | 
					
						
							|  |  |  |                      "insertBefore(<fragment>, None)") | 
					
						
							|  |  |  |         frag.unlink() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes() | 
					
						
							|  |  |  |         dom.documentElement.insertBefore(frag, orig) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.confirm(tuple(dom.documentElement.childNodes) == | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                      (c1, c2, c3, orig), | 
					
						
							|  |  |  |                      "insertBefore(<fragment>, orig)") | 
					
						
							|  |  |  |         frag.unlink() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAppendChild(self): | 
					
						
							|  |  |  |         dom = parse(tstfile) | 
					
						
							|  |  |  |         dom.documentElement.appendChild(dom.createComment(u"Hello")) | 
					
						
							|  |  |  |         self.confirm(dom.documentElement.childNodes[-1].nodeName == "#comment") | 
					
						
							|  |  |  |         self.confirm(dom.documentElement.childNodes[-1].data == "Hello") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAppendChildFragment(self): | 
					
						
							|  |  |  |         dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes() | 
					
						
							|  |  |  |         dom.documentElement.appendChild(frag) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.confirm(tuple(dom.documentElement.childNodes) == | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                      (orig, c1, c2, c3), | 
					
						
							|  |  |  |                      "appendChild(<fragment>)") | 
					
						
							|  |  |  |         frag.unlink() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testReplaceChildFragment(self): | 
					
						
							|  |  |  |         dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes() | 
					
						
							|  |  |  |         dom.documentElement.replaceChild(frag, orig) | 
					
						
							|  |  |  |         orig.unlink() | 
					
						
							|  |  |  |         self.confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3), | 
					
						
							|  |  |  |                 "replaceChild(<fragment>)") | 
					
						
							|  |  |  |         frag.unlink() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testLegalChildren(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         elem = dom.createElement('element') | 
					
						
							|  |  |  |         text = dom.createTextNode('text') | 
					
						
							|  |  |  |         self.assertRaises(xml.dom.HierarchyRequestErr, dom.appendChild, text) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         dom.appendChild(elem) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.HierarchyRequestErr, dom.insertBefore, text, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           elem) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.HierarchyRequestErr, dom.replaceChild, text, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           elem) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         nodemap = elem.attributes | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.HierarchyRequestErr, nodemap.setNamedItem, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           text) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.HierarchyRequestErr, nodemap.setNamedItemNS, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           text) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         elem.appendChild(text) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testNamedNodeMapSetItem(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         elem = dom.createElement('element') | 
					
						
							|  |  |  |         attrs = elem.attributes | 
					
						
							|  |  |  |         attrs["foo"] = "bar" | 
					
						
							|  |  |  |         a = attrs.item(0) | 
					
						
							|  |  |  |         self.confirm(a.ownerDocument is dom, | 
					
						
							|  |  |  |                 "NamedNodeMap.__setitem__() sets ownerDocument") | 
					
						
							|  |  |  |         self.confirm(a.ownerElement is elem, | 
					
						
							|  |  |  |                 "NamedNodeMap.__setitem__() sets ownerElement") | 
					
						
							|  |  |  |         self.confirm(a.value == "bar", | 
					
						
							|  |  |  |                 "NamedNodeMap.__setitem__() sets value") | 
					
						
							|  |  |  |         self.confirm(a.nodeValue == "bar", | 
					
						
							|  |  |  |                 "NamedNodeMap.__setitem__() sets nodeValue") | 
					
						
							|  |  |  |         elem.unlink() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testNonZero(self): | 
					
						
							|  |  |  |         dom = parse(tstfile) | 
					
						
							|  |  |  |         self.confirm(dom)# should not be zero | 
					
						
							|  |  |  |         dom.appendChild(dom.createComment("foo")) | 
					
						
							|  |  |  |         self.confirm(not dom.childNodes[-1].childNodes) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testUnlink(self): | 
					
						
							|  |  |  |         dom = parse(tstfile) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testElement(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         dom.appendChild(dom.createElement("abc")) | 
					
						
							|  |  |  |         self.confirm(dom.documentElement) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAAA(self): | 
					
						
							|  |  |  |         dom = parseString("<abc/>") | 
					
						
							|  |  |  |         el = dom.documentElement | 
					
						
							|  |  |  |         el.setAttribute("spam", "jam2") | 
					
						
							|  |  |  |         self.confirm(el.toxml() == '<abc spam="jam2"/>', "testAAA") | 
					
						
							|  |  |  |         a = el.getAttributeNode("spam") | 
					
						
							|  |  |  |         self.confirm(a.ownerDocument is dom, | 
					
						
							|  |  |  |                 "setAttribute() sets ownerDocument") | 
					
						
							|  |  |  |         self.confirm(a.ownerElement is dom.documentElement, | 
					
						
							|  |  |  |                 "setAttribute() sets ownerElement") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAAB(self): | 
					
						
							|  |  |  |         dom = parseString("<abc/>") | 
					
						
							|  |  |  |         el = dom.documentElement | 
					
						
							|  |  |  |         el.setAttribute("spam", "jam") | 
					
						
							|  |  |  |         el.setAttribute("spam", "jam2") | 
					
						
							|  |  |  |         self.confirm(el.toxml() == '<abc spam="jam2"/>', "testAAB") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAddAttr(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         child = dom.appendChild(dom.createElement("abc")) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         child.setAttribute("def", "ghi") | 
					
						
							|  |  |  |         self.confirm(child.getAttribute("def") == "ghi") | 
					
						
							|  |  |  |         self.confirm(child.attributes["def"].value == "ghi") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         child.setAttribute("jkl", "mno") | 
					
						
							|  |  |  |         self.confirm(child.getAttribute("jkl") == "mno") | 
					
						
							|  |  |  |         self.confirm(child.attributes["jkl"].value == "mno") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(len(child.attributes) == 2) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         child.setAttribute("def", "newval") | 
					
						
							|  |  |  |         self.confirm(child.getAttribute("def") == "newval") | 
					
						
							|  |  |  |         self.confirm(child.attributes["def"].value == "newval") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(len(child.attributes) == 2) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testDeleteAttr(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         child = dom.appendChild(dom.createElement("abc")) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(len(child.attributes) == 0) | 
					
						
							|  |  |  |         child.setAttribute("def", "ghi") | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 1) | 
					
						
							|  |  |  |         del child.attributes["def"] | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 0) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRemoveAttr(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         child = dom.appendChild(dom.createElement("abc")) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         child.setAttribute("def", "ghi") | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 1) | 
					
						
							|  |  |  |         child.removeAttribute("def") | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 0) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRemoveAttrNS(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         child = dom.appendChild( | 
					
						
							|  |  |  |                 dom.createElementNS("http://www.python.org", "python:abc")) | 
					
						
							|  |  |  |         child.setAttributeNS("http://www.w3.org", "xmlns:python", | 
					
						
							|  |  |  |                                                 "http://www.python.org") | 
					
						
							|  |  |  |         child.setAttributeNS("http://www.python.org", "python:abcattr", "foo") | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 2) | 
					
						
							|  |  |  |         child.removeAttributeNS("http://www.python.org", "abcattr") | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 1) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRemoveAttributeNode(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         child = dom.appendChild(dom.createElement("foo")) | 
					
						
							|  |  |  |         child.setAttribute("spam", "jam") | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 1) | 
					
						
							|  |  |  |         node = child.getAttributeNode("spam") | 
					
						
							|  |  |  |         child.removeAttributeNode(node) | 
					
						
							|  |  |  |         self.confirm(len(child.attributes) == 0 | 
					
						
							|  |  |  |                 and child.getAttributeNode("spam") is None) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testChangeAttr(self): | 
					
						
							|  |  |  |         dom = parseString("<abc/>") | 
					
						
							|  |  |  |         el = dom.documentElement | 
					
						
							|  |  |  |         el.setAttribute("spam", "jam") | 
					
						
							|  |  |  |         self.confirm(len(el.attributes) == 1) | 
					
						
							|  |  |  |         el.setAttribute("spam", "bam") | 
					
						
							|  |  |  |         # Set this attribute to be an ID and make sure that doesn't change | 
					
						
							|  |  |  |         # when changing the value: | 
					
						
							|  |  |  |         el.setIdAttribute("spam") | 
					
						
							|  |  |  |         self.confirm(len(el.attributes) == 1 | 
					
						
							|  |  |  |                 and el.attributes["spam"].value == "bam" | 
					
						
							|  |  |  |                 and el.attributes["spam"].nodeValue == "bam" | 
					
						
							|  |  |  |                 and el.getAttribute("spam") == "bam" | 
					
						
							|  |  |  |                 and el.getAttributeNode("spam").isId) | 
					
						
							|  |  |  |         el.attributes["spam"] = "ham" | 
					
						
							|  |  |  |         self.confirm(len(el.attributes) == 1 | 
					
						
							|  |  |  |                 and el.attributes["spam"].value == "ham" | 
					
						
							|  |  |  |                 and el.attributes["spam"].nodeValue == "ham" | 
					
						
							|  |  |  |                 and el.getAttribute("spam") == "ham" | 
					
						
							|  |  |  |                 and el.attributes["spam"].isId) | 
					
						
							|  |  |  |         el.setAttribute("spam2", "bam") | 
					
						
							|  |  |  |         self.confirm(len(el.attributes) == 2 | 
					
						
							|  |  |  |                 and el.attributes["spam"].value == "ham" | 
					
						
							|  |  |  |                 and el.attributes["spam"].nodeValue == "ham" | 
					
						
							|  |  |  |                 and el.getAttribute("spam") == "ham" | 
					
						
							|  |  |  |                 and el.attributes["spam2"].value == "bam" | 
					
						
							|  |  |  |                 and el.attributes["spam2"].nodeValue == "bam" | 
					
						
							|  |  |  |                 and el.getAttribute("spam2") == "bam") | 
					
						
							|  |  |  |         el.attributes["spam2"] = "bam2" | 
					
						
							|  |  |  |         self.confirm(len(el.attributes) == 2 | 
					
						
							|  |  |  |                 and el.attributes["spam"].value == "ham" | 
					
						
							|  |  |  |                 and el.attributes["spam"].nodeValue == "ham" | 
					
						
							|  |  |  |                 and el.getAttribute("spam") == "ham" | 
					
						
							|  |  |  |                 and el.attributes["spam2"].value == "bam2" | 
					
						
							|  |  |  |                 and el.attributes["spam2"].nodeValue == "bam2" | 
					
						
							|  |  |  |                 and el.getAttribute("spam2") == "bam2") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetAttrList(self): | 
					
						
							| 
									
										
										
										
											2003-01-25 21:39:09 +00:00
										 |  |  |         pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetAttrValues(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetAttrLength(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetAttribute(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetAttributeNS(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetAttributeNode(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetElementsByTagNameNS(self): | 
					
						
							|  |  |  |         d="""<foo xmlns:minidom='http://pyxml.sf.net/minidom'>
 | 
					
						
							|  |  |  |         <minidom:myelem/> | 
					
						
							|  |  |  |         </foo>"""
 | 
					
						
							|  |  |  |         dom = parseString(d) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         elems = dom.getElementsByTagNameNS("http://pyxml.sf.net/minidom", | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                                            "myelem") | 
					
						
							|  |  |  |         self.confirm(len(elems) == 1 | 
					
						
							|  |  |  |                 and elems[0].namespaceURI == "http://pyxml.sf.net/minidom" | 
					
						
							|  |  |  |                 and elems[0].localName == "myelem" | 
					
						
							|  |  |  |                 and elems[0].prefix == "minidom" | 
					
						
							|  |  |  |                 and elems[0].tagName == "minidom:myelem" | 
					
						
							|  |  |  |                 and elems[0].nodeName == "minidom:myelem") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_empty_nodelist_from_elements_by_tagName_ns_helper(self, doc, nsuri, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                                                               lname): | 
					
						
							|  |  |  |         nodelist = doc.getElementsByTagNameNS(nsuri, lname) | 
					
						
							|  |  |  |         self.confirm(len(nodelist) == 0) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testGetEmptyNodeListFromElementsByTagNameNS(self): | 
					
						
							|  |  |  |         doc = parseString('<doc/>') | 
					
						
							|  |  |  |         self.get_empty_nodelist_from_elements_by_tagName_ns_helper( | 
					
						
							|  |  |  |             doc, 'http://xml.python.org/namespaces/a', 'localname') | 
					
						
							|  |  |  |         self.get_empty_nodelist_from_elements_by_tagName_ns_helper( | 
					
						
							|  |  |  |             doc, '*', 'splat') | 
					
						
							|  |  |  |         self.get_empty_nodelist_from_elements_by_tagName_ns_helper( | 
					
						
							|  |  |  |             doc, 'http://xml.python.org/namespaces/a', '*') | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc = parseString('<doc xmlns="http://xml.python.org/splat"><e/></doc>') | 
					
						
							|  |  |  |         self.get_empty_nodelist_from_elements_by_tagName_ns_helper( | 
					
						
							|  |  |  |             doc, "http://xml.python.org/splat", "not-there") | 
					
						
							|  |  |  |         self.get_empty_nodelist_from_elements_by_tagName_ns_helper( | 
					
						
							|  |  |  |             doc, "*", "not-there") | 
					
						
							|  |  |  |         self.get_empty_nodelist_from_elements_by_tagName_ns_helper( | 
					
						
							|  |  |  |             doc, "http://somewhere.else.net/not-there", "e") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testElementReprAndStr(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         el = dom.appendChild(dom.createElement("abc")) | 
					
						
							|  |  |  |         string1 = repr(el) | 
					
						
							|  |  |  |         string2 = str(el) | 
					
						
							|  |  |  |         self.confirm(string1 == string2) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testElementReprAndStrUnicode(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         el = dom.appendChild(dom.createElement(u"abc")) | 
					
						
							|  |  |  |         string1 = repr(el) | 
					
						
							|  |  |  |         string2 = str(el) | 
					
						
							|  |  |  |         self.confirm(string1 == string2) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testElementReprAndStrUnicodeNS(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         el = dom.appendChild( | 
					
						
							|  |  |  |             dom.createElementNS(u"http://www.slashdot.org", u"slash:abc")) | 
					
						
							|  |  |  |         string1 = repr(el) | 
					
						
							|  |  |  |         string2 = str(el) | 
					
						
							|  |  |  |         self.confirm(string1 == string2) | 
					
						
							|  |  |  |         self.confirm(string1.find("slash:abc") != -1) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttributeRepr(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         el = dom.appendChild(dom.createElement(u"abc")) | 
					
						
							|  |  |  |         node = el.setAttribute("abc", "def") | 
					
						
							|  |  |  |         self.confirm(str(node) == repr(node)) | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testTextNodeRepr(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testWriteXML(self): | 
					
						
							|  |  |  |         str = '<?xml version="1.0" ?><a b="c"/>' | 
					
						
							|  |  |  |         dom = parseString(str) | 
					
						
							|  |  |  |         domstr = dom.toxml() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							|  |  |  |         self.confirm(str == domstr) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAltNewline(self): | 
					
						
							|  |  |  |         str = '<?xml version="1.0" ?>\n<a b="c"/>\n' | 
					
						
							|  |  |  |         dom = parseString(str) | 
					
						
							|  |  |  |         domstr = dom.toprettyxml(newl="\r\n") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							|  |  |  |         self.confirm(domstr == str.replace("\n", "\r\n")) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testProcessingInstruction(self): | 
					
						
							|  |  |  |         dom = parseString('<e><?mypi \t\n data \t\n ?></e>') | 
					
						
							|  |  |  |         pi = dom.documentElement.firstChild | 
					
						
							|  |  |  |         self.confirm(pi.target == "mypi" | 
					
						
							|  |  |  |                 and pi.data == "data \t\n " | 
					
						
							|  |  |  |                 and pi.nodeName == "mypi" | 
					
						
							|  |  |  |                 and pi.nodeType == Node.PROCESSING_INSTRUCTION_NODE | 
					
						
							|  |  |  |                 and pi.attributes is None | 
					
						
							|  |  |  |                 and not pi.hasChildNodes() | 
					
						
							|  |  |  |                 and len(pi.childNodes) == 0 | 
					
						
							|  |  |  |                 and pi.firstChild is None | 
					
						
							|  |  |  |                 and pi.lastChild is None | 
					
						
							|  |  |  |                 and pi.localName is None | 
					
						
							|  |  |  |                 and pi.namespaceURI == xml.dom.EMPTY_NAMESPACE) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testProcessingInstructionRepr(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testTextRepr(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testWriteText(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testDocumentElement(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testTooManyDocumentElements(self): | 
					
						
							|  |  |  |         doc = parseString("<doc/>") | 
					
						
							|  |  |  |         elem = doc.createElement("extra") | 
					
						
							|  |  |  |         # Should raise an exception when adding an extra document element. | 
					
						
							|  |  |  |         self.assertRaises(xml.dom.HierarchyRequestErr, doc.appendChild, elem) | 
					
						
							|  |  |  |         elem.unlink() | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testCreateElementNS(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testCreateAttributeNS(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParse(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseString(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testComment(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListItem(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListItems(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListItemNS(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListKeys(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListKeysNS(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRemoveNamedItem(self): | 
					
						
							|  |  |  |         doc = parseString("<doc a=''/>") | 
					
						
							|  |  |  |         e = doc.documentElement | 
					
						
							|  |  |  |         attrs = e.attributes | 
					
						
							|  |  |  |         a1 = e.getAttributeNode("a") | 
					
						
							|  |  |  |         a2 = attrs.removeNamedItem("a") | 
					
						
							|  |  |  |         self.confirm(a1.isSameNode(a2)) | 
					
						
							|  |  |  |         self.assertRaises(xml.dom.NotFoundErr, attrs.removeNamedItem, "a") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRemoveNamedItemNS(self): | 
					
						
							|  |  |  |         doc = parseString("<doc xmlns:a='http://xml.python.org/' a:b=''/>") | 
					
						
							|  |  |  |         e = doc.documentElement | 
					
						
							|  |  |  |         attrs = e.attributes | 
					
						
							|  |  |  |         a1 = e.getAttributeNodeNS("http://xml.python.org/", "b") | 
					
						
							|  |  |  |         a2 = attrs.removeNamedItemNS("http://xml.python.org/", "b") | 
					
						
							|  |  |  |         self.confirm(a1.isSameNode(a2)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.NotFoundErr, attrs.removeNamedItemNS, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           "http://xml.python.org/", "b") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListValues(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrListLength(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrList__getitem__(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testAttrList__setitem__(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testSetAttrValueandNodeValue(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseElement(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseAttributes(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseElementNamespaces(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseAttributeNamespaces(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParseProcessingInstructions(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testChildNodes(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testFirstChild(self): pass | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testHasChildNodes(self): pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _testCloneElementCopiesAttributes(self, e1, e2, test): | 
					
						
							|  |  |  |         attrs1 = e1.attributes | 
					
						
							|  |  |  |         attrs2 = e2.attributes | 
					
						
							|  |  |  |         keys1 = attrs1.keys() | 
					
						
							|  |  |  |         keys2 = attrs2.keys() | 
					
						
							|  |  |  |         keys1.sort() | 
					
						
							|  |  |  |         keys2.sort() | 
					
						
							|  |  |  |         self.confirm(keys1 == keys2, "clone of element has same attribute keys") | 
					
						
							|  |  |  |         for i in range(len(keys1)): | 
					
						
							|  |  |  |             a1 = attrs1.item(i) | 
					
						
							|  |  |  |             a2 = attrs2.item(i) | 
					
						
							|  |  |  |             self.confirm(a1 is not a2 | 
					
						
							|  |  |  |                     and a1.value == a2.value | 
					
						
							|  |  |  |                     and a1.nodeValue == a2.nodeValue | 
					
						
							|  |  |  |                     and a1.namespaceURI == a2.namespaceURI | 
					
						
							|  |  |  |                     and a1.localName == a2.localName | 
					
						
							|  |  |  |                     , "clone of attribute node has proper attribute values") | 
					
						
							|  |  |  |             self.confirm(a2.ownerElement is e2, | 
					
						
							|  |  |  |                     "clone of attribute node correctly owned") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def _setupCloneElement(self, deep): | 
					
						
							|  |  |  |         dom = parseString("<doc attr='value'><foo/></doc>") | 
					
						
							|  |  |  |         root = dom.documentElement | 
					
						
							|  |  |  |         clone = root.cloneNode(deep) | 
					
						
							|  |  |  |         self._testCloneElementCopiesAttributes( | 
					
						
							|  |  |  |             root, clone, "testCloneElement" + (deep and "Deep" or "Shallow")) | 
					
						
							|  |  |  |         # mutilate the original so shared data is detected | 
					
						
							|  |  |  |         root.tagName = root.nodeName = "MODIFIED" | 
					
						
							|  |  |  |         root.setAttribute("attr", "NEW VALUE") | 
					
						
							|  |  |  |         root.setAttribute("added", "VALUE") | 
					
						
							|  |  |  |         return dom, clone | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testCloneElementShallow(self): | 
					
						
							|  |  |  |         dom, clone = self._setupCloneElement(0) | 
					
						
							|  |  |  |         self.confirm(len(clone.childNodes) == 0 | 
					
						
							|  |  |  |                 and clone.childNodes.length == 0 | 
					
						
							|  |  |  |                 and clone.parentNode is None | 
					
						
							|  |  |  |                 and clone.toxml() == '<doc attr="value"/>' | 
					
						
							|  |  |  |                 , "testCloneElementShallow") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testCloneElementDeep(self): | 
					
						
							|  |  |  |         dom, clone = self._setupCloneElement(1) | 
					
						
							|  |  |  |         self.confirm(len(clone.childNodes) == 1 | 
					
						
							|  |  |  |                 and clone.childNodes.length == 1 | 
					
						
							|  |  |  |                 and clone.parentNode is None | 
					
						
							|  |  |  |                 and clone.toxml() == '<doc attr="value"><foo/></doc>' | 
					
						
							|  |  |  |                 , "testCloneElementDeep") | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCloneDocumentShallow(self): | 
					
						
							|  |  |  |         doc = parseString("<?xml version='1.0'?>\n" | 
					
						
							|  |  |  |                     "<!-- comment -->" | 
					
						
							|  |  |  |                     "<!DOCTYPE doc [\n" | 
					
						
							|  |  |  |                     "<!NOTATION notation SYSTEM 'http://xml.python.org/'>\n" | 
					
						
							|  |  |  |                     "]>\n" | 
					
						
							|  |  |  |                     "<doc attr='value'/>") | 
					
						
							|  |  |  |         doc2 = doc.cloneNode(0) | 
					
						
							|  |  |  |         self.confirm(doc2 is None, | 
					
						
							|  |  |  |                 "testCloneDocumentShallow:" | 
					
						
							|  |  |  |                 " shallow cloning of documents makes no sense!") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCloneDocumentDeep(self): | 
					
						
							|  |  |  |         doc = parseString("<?xml version='1.0'?>\n" | 
					
						
							|  |  |  |                     "<!-- comment -->" | 
					
						
							|  |  |  |                     "<!DOCTYPE doc [\n" | 
					
						
							|  |  |  |                     "<!NOTATION notation SYSTEM 'http://xml.python.org/'>\n" | 
					
						
							|  |  |  |                     "]>\n" | 
					
						
							|  |  |  |                     "<doc attr='value'/>") | 
					
						
							|  |  |  |         doc2 = doc.cloneNode(1) | 
					
						
							|  |  |  |         self.confirm(not (doc.isSameNode(doc2) or doc2.isSameNode(doc)), | 
					
						
							|  |  |  |                 "testCloneDocumentDeep: document objects not distinct") | 
					
						
							|  |  |  |         self.confirm(len(doc.childNodes) == len(doc2.childNodes), | 
					
						
							|  |  |  |                 "testCloneDocumentDeep: wrong number of Document children") | 
					
						
							|  |  |  |         self.confirm(doc2.documentElement.nodeType == Node.ELEMENT_NODE, | 
					
						
							|  |  |  |                 "testCloneDocumentDeep: documentElement not an ELEMENT_NODE") | 
					
						
							|  |  |  |         self.confirm(doc2.documentElement.ownerDocument.isSameNode(doc2), | 
					
						
							|  |  |  |             "testCloneDocumentDeep: documentElement owner is not new document") | 
					
						
							|  |  |  |         self.confirm(not doc.documentElement.isSameNode(doc2.documentElement), | 
					
						
							|  |  |  |                 "testCloneDocumentDeep: documentElement should not be shared") | 
					
						
							|  |  |  |         if doc.doctype is not None: | 
					
						
							|  |  |  |             # check the doctype iff the original DOM maintained it | 
					
						
							|  |  |  |             self.confirm(doc2.doctype.nodeType == Node.DOCUMENT_TYPE_NODE, | 
					
						
							|  |  |  |                     "testCloneDocumentDeep: doctype not a DOCUMENT_TYPE_NODE") | 
					
						
							|  |  |  |             self.confirm(doc2.doctype.ownerDocument.isSameNode(doc2)) | 
					
						
							|  |  |  |             self.confirm(not doc.doctype.isSameNode(doc2.doctype)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCloneDocumentTypeDeepOk(self): | 
					
						
							|  |  |  |         doctype = create_nonempty_doctype() | 
					
						
							|  |  |  |         clone = doctype.cloneNode(1) | 
					
						
							|  |  |  |         self.confirm(clone is not None | 
					
						
							|  |  |  |                 and clone.nodeName == doctype.nodeName | 
					
						
							|  |  |  |                 and clone.name == doctype.name | 
					
						
							|  |  |  |                 and clone.publicId == doctype.publicId | 
					
						
							|  |  |  |                 and clone.systemId == doctype.systemId | 
					
						
							|  |  |  |                 and len(clone.entities) == len(doctype.entities) | 
					
						
							|  |  |  |                 and clone.entities.item(len(clone.entities)) is None | 
					
						
							|  |  |  |                 and len(clone.notations) == len(doctype.notations) | 
					
						
							|  |  |  |                 and clone.notations.item(len(clone.notations)) is None | 
					
						
							|  |  |  |                 and len(clone.childNodes) == 0) | 
					
						
							|  |  |  |         for i in range(len(doctype.entities)): | 
					
						
							|  |  |  |             se = doctype.entities.item(i) | 
					
						
							|  |  |  |             ce = clone.entities.item(i) | 
					
						
							|  |  |  |             self.confirm((not se.isSameNode(ce)) | 
					
						
							|  |  |  |                     and (not ce.isSameNode(se)) | 
					
						
							|  |  |  |                     and ce.nodeName == se.nodeName | 
					
						
							|  |  |  |                     and ce.notationName == se.notationName | 
					
						
							|  |  |  |                     and ce.publicId == se.publicId | 
					
						
							|  |  |  |                     and ce.systemId == se.systemId | 
					
						
							|  |  |  |                     and ce.encoding == se.encoding | 
					
						
							|  |  |  |                     and ce.actualEncoding == se.actualEncoding | 
					
						
							|  |  |  |                     and ce.version == se.version) | 
					
						
							|  |  |  |         for i in range(len(doctype.notations)): | 
					
						
							|  |  |  |             sn = doctype.notations.item(i) | 
					
						
							|  |  |  |             cn = clone.notations.item(i) | 
					
						
							|  |  |  |             self.confirm((not sn.isSameNode(cn)) | 
					
						
							|  |  |  |                     and (not cn.isSameNode(sn)) | 
					
						
							|  |  |  |                     and cn.nodeName == sn.nodeName | 
					
						
							|  |  |  |                     and cn.publicId == sn.publicId | 
					
						
							|  |  |  |                     and cn.systemId == sn.systemId) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCloneDocumentTypeDeepNotOk(self): | 
					
						
							|  |  |  |         doc = create_doc_with_doctype() | 
					
						
							|  |  |  |         clone = doc.doctype.cloneNode(1) | 
					
						
							|  |  |  |         self.confirm(clone is None, "testCloneDocumentTypeDeepNotOk") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCloneDocumentTypeShallowOk(self): | 
					
						
							|  |  |  |         doctype = create_nonempty_doctype() | 
					
						
							|  |  |  |         clone = doctype.cloneNode(0) | 
					
						
							|  |  |  |         self.confirm(clone is not None | 
					
						
							|  |  |  |                 and clone.nodeName == doctype.nodeName | 
					
						
							|  |  |  |                 and clone.name == doctype.name | 
					
						
							|  |  |  |                 and clone.publicId == doctype.publicId | 
					
						
							|  |  |  |                 and clone.systemId == doctype.systemId | 
					
						
							|  |  |  |                 and len(clone.entities) == 0 | 
					
						
							|  |  |  |                 and clone.entities.item(0) is None | 
					
						
							|  |  |  |                 and len(clone.notations) == 0 | 
					
						
							|  |  |  |                 and clone.notations.item(0) is None | 
					
						
							|  |  |  |                 and len(clone.childNodes) == 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCloneDocumentTypeShallowNotOk(self): | 
					
						
							|  |  |  |         doc = create_doc_with_doctype() | 
					
						
							|  |  |  |         clone = doc.doctype.cloneNode(0) | 
					
						
							|  |  |  |         self.confirm(clone is None, "testCloneDocumentTypeShallowNotOk") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def check_import_document(self, deep, testName): | 
					
						
							|  |  |  |         doc1 = parseString("<doc/>") | 
					
						
							|  |  |  |         doc2 = parseString("<doc/>") | 
					
						
							|  |  |  |         self.assertRaises(xml.dom.NotSupportedErr, doc1.importNode, doc2, deep) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testImportDocumentShallow(self): | 
					
						
							|  |  |  |         self.check_import_document(0, "testImportDocumentShallow") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testImportDocumentDeep(self): | 
					
						
							|  |  |  |         self.check_import_document(1, "testImportDocumentDeep") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testImportDocumentTypeShallow(self): | 
					
						
							|  |  |  |         src = create_doc_with_doctype() | 
					
						
							|  |  |  |         target = create_doc_without_doctype() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.NotSupportedErr, target.importNode, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           src.doctype, 0) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testImportDocumentTypeDeep(self): | 
					
						
							|  |  |  |         src = create_doc_with_doctype() | 
					
						
							|  |  |  |         target = create_doc_without_doctype() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.NotSupportedErr, target.importNode, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           src.doctype, 1) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     # Testing attribute clones uses a helper, and should always be deep, | 
					
						
							|  |  |  |     # even if the argument to cloneNode is false. | 
					
						
							|  |  |  |     def check_clone_attribute(self, deep, testName): | 
					
						
							|  |  |  |         doc = parseString("<doc attr='value'/>") | 
					
						
							|  |  |  |         attr = doc.documentElement.getAttributeNode("attr") | 
					
						
							|  |  |  |         self.failIfEqual(attr, None) | 
					
						
							|  |  |  |         clone = attr.cloneNode(deep) | 
					
						
							|  |  |  |         self.confirm(not clone.isSameNode(attr)) | 
					
						
							|  |  |  |         self.confirm(not attr.isSameNode(clone)) | 
					
						
							|  |  |  |         self.confirm(clone.ownerElement is None, | 
					
						
							|  |  |  |                 testName + ": ownerElement should be None") | 
					
						
							|  |  |  |         self.confirm(clone.ownerDocument.isSameNode(attr.ownerDocument), | 
					
						
							|  |  |  |                 testName + ": ownerDocument does not match") | 
					
						
							|  |  |  |         self.confirm(clone.specified, | 
					
						
							|  |  |  |                 testName + ": cloned attribute must have specified == True") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testCloneAttributeShallow(self): | 
					
						
							|  |  |  |         self.check_clone_attribute(0, "testCloneAttributeShallow") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testCloneAttributeDeep(self): | 
					
						
							|  |  |  |         self.check_clone_attribute(1, "testCloneAttributeDeep") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def check_clone_pi(self, deep, testName): | 
					
						
							|  |  |  |         doc = parseString("<?target data?><doc/>") | 
					
						
							|  |  |  |         pi = doc.firstChild | 
					
						
							|  |  |  |         self.assertEquals(pi.nodeType, Node.PROCESSING_INSTRUCTION_NODE) | 
					
						
							|  |  |  |         clone = pi.cloneNode(deep) | 
					
						
							|  |  |  |         self.confirm(clone.target == pi.target | 
					
						
							|  |  |  |                 and clone.data == pi.data) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testClonePIShallow(self): | 
					
						
							|  |  |  |         self.check_clone_pi(0, "testClonePIShallow") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testClonePIDeep(self): | 
					
						
							|  |  |  |         self.check_clone_pi(1, "testClonePIDeep") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testNormalize(self): | 
					
						
							|  |  |  |         doc = parseString("<doc/>") | 
					
						
							|  |  |  |         root = doc.documentElement | 
					
						
							|  |  |  |         root.appendChild(doc.createTextNode("first")) | 
					
						
							|  |  |  |         root.appendChild(doc.createTextNode("second")) | 
					
						
							|  |  |  |         self.confirm(len(root.childNodes) == 2 | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |                 and root.childNodes.length == 2, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                 "testNormalize -- preparation") | 
					
						
							|  |  |  |         doc.normalize() | 
					
						
							|  |  |  |         self.confirm(len(root.childNodes) == 1 | 
					
						
							|  |  |  |                 and root.childNodes.length == 1 | 
					
						
							|  |  |  |                 and root.firstChild is root.lastChild | 
					
						
							|  |  |  |                 and root.firstChild.data == "firstsecond" | 
					
						
							|  |  |  |                 , "testNormalize -- result") | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc = parseString("<doc/>") | 
					
						
							|  |  |  |         root = doc.documentElement | 
					
						
							|  |  |  |         root.appendChild(doc.createTextNode("")) | 
					
						
							|  |  |  |         doc.normalize() | 
					
						
							|  |  |  |         self.confirm(len(root.childNodes) == 0 | 
					
						
							|  |  |  |                 and root.childNodes.length == 0, | 
					
						
							|  |  |  |                 "testNormalize -- single empty node removed") | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-23 17:10:46 +00:00
										 |  |  |     def testBug1433694(self): | 
					
						
							|  |  |  |         doc = parseString("<o><i/>t</o>") | 
					
						
							|  |  |  |         node = doc.documentElement | 
					
						
							|  |  |  |         node.childNodes[1].nodeValue = "" | 
					
						
							|  |  |  |         node.normalize() | 
					
						
							|  |  |  |         self.confirm(node.childNodes[-1].nextSibling == None, | 
					
						
							|  |  |  |                      "Final child's .nextSibling should be None") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testSiblings(self): | 
					
						
							|  |  |  |         doc = parseString("<doc><?pi?>text?<elm/></doc>") | 
					
						
							|  |  |  |         root = doc.documentElement | 
					
						
							|  |  |  |         (pi, text, elm) = root.childNodes | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(pi.nextSibling is text and | 
					
						
							|  |  |  |                 pi.previousSibling is None and | 
					
						
							|  |  |  |                 text.nextSibling is elm and | 
					
						
							|  |  |  |                 text.previousSibling is pi and | 
					
						
							|  |  |  |                 elm.nextSibling is None and | 
					
						
							|  |  |  |                 elm.previousSibling is text, "testSiblings") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testParents(self): | 
					
						
							|  |  |  |         doc = parseString( | 
					
						
							|  |  |  |             "<doc><elm1><elm2/><elm2><elm3/></elm2></elm1></doc>") | 
					
						
							|  |  |  |         root = doc.documentElement | 
					
						
							|  |  |  |         elm1 = root.childNodes[0] | 
					
						
							|  |  |  |         (elm2a, elm2b) = elm1.childNodes | 
					
						
							|  |  |  |         elm3 = elm2b.childNodes[0] | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(root.parentNode is doc and | 
					
						
							|  |  |  |                 elm1.parentNode is root and | 
					
						
							|  |  |  |                 elm2a.parentNode is elm1 and | 
					
						
							|  |  |  |                 elm2b.parentNode is elm1 and | 
					
						
							|  |  |  |                 elm3.parentNode is elm2b, "testParents") | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testNodeListItem(self): | 
					
						
							|  |  |  |         doc = parseString("<doc><e/><e/></doc>") | 
					
						
							|  |  |  |         children = doc.childNodes | 
					
						
							|  |  |  |         docelem = children[0] | 
					
						
							|  |  |  |         self.confirm(children[0] is children.item(0) | 
					
						
							|  |  |  |                 and children.item(1) is None | 
					
						
							|  |  |  |                 and docelem.childNodes.item(0) is docelem.childNodes[0] | 
					
						
							|  |  |  |                 and docelem.childNodes.item(1) is docelem.childNodes[1] | 
					
						
							|  |  |  |                 and docelem.childNodes.item(0).childNodes.item(0) is None, | 
					
						
							|  |  |  |                 "test NodeList.item()") | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testSAX2DOM(self): | 
					
						
							|  |  |  |         from xml.dom import pulldom | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         sax2dom = pulldom.SAX2DOM() | 
					
						
							|  |  |  |         sax2dom.startDocument() | 
					
						
							|  |  |  |         sax2dom.startElement("doc", {}) | 
					
						
							|  |  |  |         sax2dom.characters("text") | 
					
						
							|  |  |  |         sax2dom.startElement("subelm", {}) | 
					
						
							|  |  |  |         sax2dom.characters("text") | 
					
						
							|  |  |  |         sax2dom.endElement("subelm") | 
					
						
							|  |  |  |         sax2dom.characters("text") | 
					
						
							|  |  |  |         sax2dom.endElement("doc") | 
					
						
							|  |  |  |         sax2dom.endDocument() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc = sax2dom.document | 
					
						
							|  |  |  |         root = doc.documentElement | 
					
						
							|  |  |  |         (text1, elm1, text2) = root.childNodes | 
					
						
							|  |  |  |         text3 = elm1.childNodes[0] | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(text1.previousSibling is None and | 
					
						
							|  |  |  |                 text1.nextSibling is elm1 and | 
					
						
							|  |  |  |                 elm1.previousSibling is text1 and | 
					
						
							|  |  |  |                 elm1.nextSibling is text2 and | 
					
						
							|  |  |  |                 text2.previousSibling is elm1 and | 
					
						
							|  |  |  |                 text2.nextSibling is None and | 
					
						
							|  |  |  |                 text3.previousSibling is None and | 
					
						
							|  |  |  |                 text3.nextSibling is None, "testSAX2DOM - siblings") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.confirm(root.parentNode is doc and | 
					
						
							|  |  |  |                 text1.parentNode is root and | 
					
						
							|  |  |  |                 elm1.parentNode is root and | 
					
						
							|  |  |  |                 text2.parentNode is root and | 
					
						
							|  |  |  |                 text3.parentNode is elm1, "testSAX2DOM - parents") | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testEncodings(self): | 
					
						
							|  |  |  |         doc = parseString('<foo>€</foo>') | 
					
						
							|  |  |  |         self.confirm(doc.toxml() == u'<?xml version="1.0" ?><foo>\u20ac</foo>' | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |                 and doc.toxml('utf-8') == | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                 '<?xml version="1.0" encoding="utf-8"?><foo>\xe2\x82\xac</foo>' | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |                 and doc.toxml('iso-8859-15') == | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                 '<?xml version="1.0" encoding="iso-8859-15"?><foo>\xa4</foo>', | 
					
						
							|  |  |  |                 "testEncodings - encoding EURO SIGN") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Verify that character decoding errors throw exceptions instead | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # of crashing | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(UnicodeDecodeError, parseString, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                 '<fran\xe7ais>Comment \xe7a va ? Tr\xe8s bien ?</fran\xe7ais>') | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc.unlink() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class UserDataHandler: | 
					
						
							|  |  |  |         called = 0 | 
					
						
							|  |  |  |         def handle(self, operation, key, data, src, dst): | 
					
						
							|  |  |  |             dst.setUserData(key, data + 1, self) | 
					
						
							|  |  |  |             src.setUserData(key, None, None) | 
					
						
							|  |  |  |             self.called = 1 | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testUserData(self): | 
					
						
							|  |  |  |         dom = Document() | 
					
						
							|  |  |  |         n = dom.createElement('e') | 
					
						
							|  |  |  |         self.confirm(n.getUserData("foo") is None) | 
					
						
							|  |  |  |         n.setUserData("foo", None, None) | 
					
						
							|  |  |  |         self.confirm(n.getUserData("foo") is None) | 
					
						
							|  |  |  |         n.setUserData("foo", 12, 12) | 
					
						
							|  |  |  |         n.setUserData("bar", 13, 13) | 
					
						
							|  |  |  |         self.confirm(n.getUserData("foo") == 12) | 
					
						
							|  |  |  |         self.confirm(n.getUserData("bar") == 13) | 
					
						
							|  |  |  |         n.setUserData("foo", None, None) | 
					
						
							|  |  |  |         self.confirm(n.getUserData("foo") is None) | 
					
						
							|  |  |  |         self.confirm(n.getUserData("bar") == 13) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         handler = self.UserDataHandler() | 
					
						
							|  |  |  |         n.setUserData("bar", 12, handler) | 
					
						
							|  |  |  |         c = n.cloneNode(1) | 
					
						
							|  |  |  |         self.confirm(handler.called | 
					
						
							|  |  |  |                 and n.getUserData("bar") is None | 
					
						
							|  |  |  |                 and c.getUserData("bar") == 13) | 
					
						
							|  |  |  |         n.unlink() | 
					
						
							|  |  |  |         c.unlink() | 
					
						
							|  |  |  |         dom.unlink() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def checkRenameNodeSharedConstraints(self, doc, node): | 
					
						
							|  |  |  |         # Make sure illegal NS usage is detected: | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.NamespaceErr, doc.renameNode, node, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           "http://xml.python.org/ns", "xmlns:foo") | 
					
						
							|  |  |  |         doc2 = parseString("<doc/>") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.WrongDocumentErr, doc2.renameNode, node, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           xml.dom.EMPTY_NAMESPACE, "foo") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRenameAttribute(self): | 
					
						
							|  |  |  |         doc = parseString("<doc a='v'/>") | 
					
						
							| 
									
										
										
										
											2003-01-25 21:39:09 +00:00
										 |  |  |         elem = doc.documentElement | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         attrmap = elem.attributes | 
					
						
							|  |  |  |         attr = elem.attributes['a'] | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Simple renaming | 
					
						
							|  |  |  |         attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "b") | 
					
						
							|  |  |  |         self.confirm(attr.name == "b" | 
					
						
							|  |  |  |                 and attr.nodeName == "b" | 
					
						
							|  |  |  |                 and attr.localName is None | 
					
						
							|  |  |  |                 and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE | 
					
						
							|  |  |  |                 and attr.prefix is None | 
					
						
							|  |  |  |                 and attr.value == "v" | 
					
						
							|  |  |  |                 and elem.getAttributeNode("a") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("b").isSameNode(attr) | 
					
						
							|  |  |  |                 and attrmap["b"].isSameNode(attr) | 
					
						
							|  |  |  |                 and attr.ownerDocument.isSameNode(doc) | 
					
						
							|  |  |  |                 and attr.ownerElement.isSameNode(elem)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Rename to have a namespace, no prefix | 
					
						
							|  |  |  |         attr = doc.renameNode(attr, "http://xml.python.org/ns", "c") | 
					
						
							|  |  |  |         self.confirm(attr.name == "c" | 
					
						
							|  |  |  |                 and attr.nodeName == "c" | 
					
						
							|  |  |  |                 and attr.localName == "c" | 
					
						
							|  |  |  |                 and attr.namespaceURI == "http://xml.python.org/ns" | 
					
						
							|  |  |  |                 and attr.prefix is None | 
					
						
							|  |  |  |                 and attr.value == "v" | 
					
						
							|  |  |  |                 and elem.getAttributeNode("a") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("b") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("c").isSameNode(attr) | 
					
						
							|  |  |  |                 and elem.getAttributeNodeNS( | 
					
						
							|  |  |  |                     "http://xml.python.org/ns", "c").isSameNode(attr) | 
					
						
							|  |  |  |                 and attrmap["c"].isSameNode(attr) | 
					
						
							|  |  |  |                 and attrmap[("http://xml.python.org/ns", "c")].isSameNode(attr)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Rename to have a namespace, with prefix | 
					
						
							|  |  |  |         attr = doc.renameNode(attr, "http://xml.python.org/ns2", "p:d") | 
					
						
							|  |  |  |         self.confirm(attr.name == "p:d" | 
					
						
							|  |  |  |                 and attr.nodeName == "p:d" | 
					
						
							|  |  |  |                 and attr.localName == "d" | 
					
						
							|  |  |  |                 and attr.namespaceURI == "http://xml.python.org/ns2" | 
					
						
							|  |  |  |                 and attr.prefix == "p" | 
					
						
							|  |  |  |                 and attr.value == "v" | 
					
						
							|  |  |  |                 and elem.getAttributeNode("a") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("b") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("c") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNodeNS( | 
					
						
							|  |  |  |                     "http://xml.python.org/ns", "c") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("p:d").isSameNode(attr) | 
					
						
							|  |  |  |                 and elem.getAttributeNodeNS( | 
					
						
							|  |  |  |                     "http://xml.python.org/ns2", "d").isSameNode(attr) | 
					
						
							|  |  |  |                 and attrmap["p:d"].isSameNode(attr) | 
					
						
							|  |  |  |                 and attrmap[("http://xml.python.org/ns2", "d")].isSameNode(attr)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Rename back to a simple non-NS node | 
					
						
							|  |  |  |         attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "e") | 
					
						
							|  |  |  |         self.confirm(attr.name == "e" | 
					
						
							|  |  |  |                 and attr.nodeName == "e" | 
					
						
							|  |  |  |                 and attr.localName is None | 
					
						
							|  |  |  |                 and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE | 
					
						
							|  |  |  |                 and attr.prefix is None | 
					
						
							|  |  |  |                 and attr.value == "v" | 
					
						
							|  |  |  |                 and elem.getAttributeNode("a") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("b") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("c") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("p:d") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNodeNS( | 
					
						
							|  |  |  |                     "http://xml.python.org/ns", "c") is None | 
					
						
							|  |  |  |                 and elem.getAttributeNode("e").isSameNode(attr) | 
					
						
							|  |  |  |                 and attrmap["e"].isSameNode(attr)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.NamespaceErr, doc.renameNode, attr, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           "http://xml.python.org/ns", "xmlns") | 
					
						
							|  |  |  |         self.checkRenameNodeSharedConstraints(doc, attr) | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRenameElement(self): | 
					
						
							|  |  |  |         doc = parseString("<doc/>") | 
					
						
							|  |  |  |         elem = doc.documentElement | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Simple renaming | 
					
						
							|  |  |  |         elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, "a") | 
					
						
							|  |  |  |         self.confirm(elem.tagName == "a" | 
					
						
							|  |  |  |                 and elem.nodeName == "a" | 
					
						
							|  |  |  |                 and elem.localName is None | 
					
						
							|  |  |  |                 and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE | 
					
						
							|  |  |  |                 and elem.prefix is None | 
					
						
							|  |  |  |                 and elem.ownerDocument.isSameNode(doc)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Rename to have a namespace, no prefix | 
					
						
							|  |  |  |         elem = doc.renameNode(elem, "http://xml.python.org/ns", "b") | 
					
						
							|  |  |  |         self.confirm(elem.tagName == "b" | 
					
						
							|  |  |  |                 and elem.nodeName == "b" | 
					
						
							|  |  |  |                 and elem.localName == "b" | 
					
						
							|  |  |  |                 and elem.namespaceURI == "http://xml.python.org/ns" | 
					
						
							|  |  |  |                 and elem.prefix is None | 
					
						
							|  |  |  |                 and elem.ownerDocument.isSameNode(doc)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Rename to have a namespace, with prefix | 
					
						
							|  |  |  |         elem = doc.renameNode(elem, "http://xml.python.org/ns2", "p:c") | 
					
						
							|  |  |  |         self.confirm(elem.tagName == "p:c" | 
					
						
							|  |  |  |                 and elem.nodeName == "p:c" | 
					
						
							|  |  |  |                 and elem.localName == "c" | 
					
						
							|  |  |  |                 and elem.namespaceURI == "http://xml.python.org/ns2" | 
					
						
							|  |  |  |                 and elem.prefix == "p" | 
					
						
							|  |  |  |                 and elem.ownerDocument.isSameNode(doc)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # Rename back to a simple non-NS node | 
					
						
							|  |  |  |         elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, "d") | 
					
						
							|  |  |  |         self.confirm(elem.tagName == "d" | 
					
						
							|  |  |  |                 and elem.nodeName == "d" | 
					
						
							|  |  |  |                 and elem.localName is None | 
					
						
							|  |  |  |                 and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE | 
					
						
							|  |  |  |                 and elem.prefix is None | 
					
						
							|  |  |  |                 and elem.ownerDocument.isSameNode(doc)) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.checkRenameNodeSharedConstraints(doc, elem) | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testRenameOther(self): | 
					
						
							|  |  |  |         # We have to create a comment node explicitly since not all DOM | 
					
						
							|  |  |  |         # builders used with minidom add comments to the DOM. | 
					
						
							|  |  |  |         doc = xml.dom.minidom.getDOMImplementation().createDocument( | 
					
						
							|  |  |  |             xml.dom.EMPTY_NAMESPACE, "e", None) | 
					
						
							|  |  |  |         node = doc.createComment("comment") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         self.assertRaises(xml.dom.NotSupportedErr, doc.renameNode, node, | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |                           xml.dom.EMPTY_NAMESPACE, "foo") | 
					
						
							|  |  |  |         doc.unlink() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testWholeText(self): | 
					
						
							|  |  |  |         doc = parseString("<doc>a</doc>") | 
					
						
							|  |  |  |         elem = doc.documentElement | 
					
						
							|  |  |  |         text = elem.childNodes[0] | 
					
						
							|  |  |  |         self.assertEquals(text.nodeType, Node.TEXT_NODE) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         self.checkWholeText(text, "a") | 
					
						
							|  |  |  |         elem.appendChild(doc.createTextNode("b")) | 
					
						
							|  |  |  |         self.checkWholeText(text, "ab") | 
					
						
							|  |  |  |         elem.insertBefore(doc.createCDATASection("c"), text) | 
					
						
							|  |  |  |         self.checkWholeText(text, "cab") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         # make sure we don't cross other nodes | 
					
						
							|  |  |  |         splitter = doc.createComment("comment") | 
					
						
							|  |  |  |         elem.appendChild(splitter) | 
					
						
							|  |  |  |         text2 = doc.createTextNode("d") | 
					
						
							|  |  |  |         elem.appendChild(text2) | 
					
						
							|  |  |  |         self.checkWholeText(text, "cab") | 
					
						
							|  |  |  |         self.checkWholeText(text2, "d") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         x = doc.createElement("x") | 
					
						
							|  |  |  |         elem.replaceChild(x, splitter) | 
					
						
							|  |  |  |         splitter = x | 
					
						
							|  |  |  |         self.checkWholeText(text, "cab") | 
					
						
							|  |  |  |         self.checkWholeText(text2, "d") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         x = doc.createProcessingInstruction("y", "z") | 
					
						
							|  |  |  |         elem.replaceChild(x, splitter) | 
					
						
							|  |  |  |         splitter = x | 
					
						
							|  |  |  |         self.checkWholeText(text, "cab") | 
					
						
							|  |  |  |         self.checkWholeText(text2, "d") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         elem.removeChild(splitter) | 
					
						
							|  |  |  |         self.checkWholeText(text, "cabd") | 
					
						
							|  |  |  |         self.checkWholeText(text2, "cabd") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testPatch1094164(self): | 
					
						
							|  |  |  |         doc = parseString("<doc><e/></doc>") | 
					
						
							|  |  |  |         elem = doc.documentElement | 
					
						
							|  |  |  |         e = elem.firstChild | 
					
						
							|  |  |  |         self.confirm(e.parentNode is elem, "Before replaceChild()") | 
					
						
							|  |  |  |         # Check that replacing a child with itself leaves the tree unchanged | 
					
						
							|  |  |  |         elem.replaceChild(e, e) | 
					
						
							|  |  |  |         self.confirm(e.parentNode is elem, "After replaceChild()") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testReplaceWholeText(self): | 
					
						
							|  |  |  |         def setup(): | 
					
						
							|  |  |  |             doc = parseString("<doc>a<e/>d</doc>") | 
					
						
							|  |  |  |             elem = doc.documentElement | 
					
						
							|  |  |  |             text1 = elem.firstChild | 
					
						
							|  |  |  |             text2 = elem.lastChild | 
					
						
							|  |  |  |             splitter = text1.nextSibling | 
					
						
							|  |  |  |             elem.insertBefore(doc.createTextNode("b"), splitter) | 
					
						
							|  |  |  |             elem.insertBefore(doc.createCDATASection("c"), text1) | 
					
						
							|  |  |  |             return doc, elem, text1, splitter, text2 | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc, elem, text1, splitter, text2 = setup() | 
					
						
							|  |  |  |         text = text1.replaceWholeText("new content") | 
					
						
							|  |  |  |         self.checkWholeText(text, "new content") | 
					
						
							|  |  |  |         self.checkWholeText(text2, "d") | 
					
						
							|  |  |  |         self.confirm(len(elem.childNodes) == 3) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc, elem, text1, splitter, text2 = setup() | 
					
						
							|  |  |  |         text = text2.replaceWholeText("new content") | 
					
						
							|  |  |  |         self.checkWholeText(text, "new content") | 
					
						
							|  |  |  |         self.checkWholeText(text1, "cab") | 
					
						
							|  |  |  |         self.confirm(len(elem.childNodes) == 5) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         doc, elem, text1, splitter, text2 = setup() | 
					
						
							|  |  |  |         text = text1.replaceWholeText("") | 
					
						
							|  |  |  |         self.checkWholeText(text2, "d") | 
					
						
							|  |  |  |         self.confirm(text is None | 
					
						
							|  |  |  |                 and len(elem.childNodes) == 2) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testSchemaType(self): | 
					
						
							|  |  |  |         doc = parseString( | 
					
						
							|  |  |  |             "<!DOCTYPE doc [\n" | 
					
						
							|  |  |  |             "  <!ENTITY e1 SYSTEM 'http://xml.python.org/e1'>\n" | 
					
						
							|  |  |  |             "  <!ENTITY e2 SYSTEM 'http://xml.python.org/e2'>\n" | 
					
						
							|  |  |  |             "  <!ATTLIST doc id   ID       #IMPLIED \n" | 
					
						
							|  |  |  |             "                ref  IDREF    #IMPLIED \n" | 
					
						
							|  |  |  |             "                refs IDREFS   #IMPLIED \n" | 
					
						
							|  |  |  |             "                enum (a|b)    #IMPLIED \n" | 
					
						
							|  |  |  |             "                ent  ENTITY   #IMPLIED \n" | 
					
						
							|  |  |  |             "                ents ENTITIES #IMPLIED \n" | 
					
						
							|  |  |  |             "                nm   NMTOKEN  #IMPLIED \n" | 
					
						
							|  |  |  |             "                nms  NMTOKENS #IMPLIED \n" | 
					
						
							|  |  |  |             "                text CDATA    #IMPLIED \n" | 
					
						
							|  |  |  |             "    >\n" | 
					
						
							|  |  |  |             "]><doc id='name' notid='name' text='splat!' enum='b'" | 
					
						
							|  |  |  |             "       ref='name' refs='name name' ent='e1' ents='e1 e2'" | 
					
						
							|  |  |  |             "       nm='123' nms='123 abc' />") | 
					
						
							|  |  |  |         elem = doc.documentElement | 
					
						
							|  |  |  |         # We don't want to rely on any specific loader at this point, so | 
					
						
							|  |  |  |         # just make sure we can get to all the names, and that the | 
					
						
							|  |  |  |         # DTD-based namespace is right.  The names can vary by loader | 
					
						
							|  |  |  |         # since each supports a different level of DTD information. | 
					
						
							|  |  |  |         t = elem.schemaType | 
					
						
							|  |  |  |         self.confirm(t.name is None | 
					
						
							| 
									
										
										
										
											2006-07-29 16:56:15 +00:00
										 |  |  |                 and t.namespace == xml.dom.EMPTY_NAMESPACE) | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |         names = "id notid text enum ref refs ent ents nm nms".split() | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             a = elem.getAttributeNode(name) | 
					
						
							|  |  |  |             t = a.schemaType | 
					
						
							|  |  |  |             self.confirm(hasattr(t, "name") | 
					
						
							|  |  |  |                     and t.namespace == xml.dom.EMPTY_NAMESPACE) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testSetIdAttribute(self): | 
					
						
							|  |  |  |         doc = parseString("<doc a1='v' a2='w'/>") | 
					
						
							|  |  |  |         e = doc.documentElement | 
					
						
							|  |  |  |         a1 = e.getAttributeNode("a1") | 
					
						
							|  |  |  |         a2 = e.getAttributeNode("a2") | 
					
						
							|  |  |  |         self.confirm(doc.getElementById("v") is None | 
					
						
							|  |  |  |                 and not a1.isId | 
					
						
							|  |  |  |                 and not a2.isId) | 
					
						
							|  |  |  |         e.setIdAttribute("a1") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("v")) | 
					
						
							|  |  |  |                 and a1.isId | 
					
						
							|  |  |  |                 and not a2.isId) | 
					
						
							|  |  |  |         e.setIdAttribute("a2") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("v")) | 
					
						
							|  |  |  |                 and e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and a1.isId | 
					
						
							|  |  |  |                 and a2.isId) | 
					
						
							|  |  |  |         # replace the a1 node; the new node should *not* be an ID | 
					
						
							|  |  |  |         a3 = doc.createAttribute("a1") | 
					
						
							|  |  |  |         a3.value = "v" | 
					
						
							|  |  |  |         e.setAttributeNode(a3) | 
					
						
							|  |  |  |         self.confirm(doc.getElementById("v") is None | 
					
						
							|  |  |  |                 and e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and not a1.isId | 
					
						
							|  |  |  |                 and a2.isId | 
					
						
							|  |  |  |                 and not a3.isId) | 
					
						
							|  |  |  |         # renaming an attribute should not affect its ID-ness: | 
					
						
							|  |  |  |         doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and a2.isId) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  |     def testSetIdAttributeNS(self): | 
					
						
							|  |  |  |         NS1 = "http://xml.python.org/ns1" | 
					
						
							|  |  |  |         NS2 = "http://xml.python.org/ns2" | 
					
						
							|  |  |  |         doc = parseString("<doc" | 
					
						
							|  |  |  |                           " xmlns:ns1='" + NS1 + "'" | 
					
						
							|  |  |  |                           " xmlns:ns2='" + NS2 + "'" | 
					
						
							|  |  |  |                           " ns1:a1='v' ns2:a2='w'/>") | 
					
						
							|  |  |  |         e = doc.documentElement | 
					
						
							|  |  |  |         a1 = e.getAttributeNodeNS(NS1, "a1") | 
					
						
							|  |  |  |         a2 = e.getAttributeNodeNS(NS2, "a2") | 
					
						
							|  |  |  |         self.confirm(doc.getElementById("v") is None | 
					
						
							|  |  |  |                 and not a1.isId | 
					
						
							|  |  |  |                 and not a2.isId) | 
					
						
							|  |  |  |         e.setIdAttributeNS(NS1, "a1") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("v")) | 
					
						
							|  |  |  |                 and a1.isId | 
					
						
							|  |  |  |                 and not a2.isId) | 
					
						
							|  |  |  |         e.setIdAttributeNS(NS2, "a2") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("v")) | 
					
						
							|  |  |  |                 and e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and a1.isId | 
					
						
							|  |  |  |                 and a2.isId) | 
					
						
							|  |  |  |         # replace the a1 node; the new node should *not* be an ID | 
					
						
							|  |  |  |         a3 = doc.createAttributeNS(NS1, "a1") | 
					
						
							|  |  |  |         a3.value = "v" | 
					
						
							|  |  |  |         e.setAttributeNode(a3) | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("w"))) | 
					
						
							|  |  |  |         self.confirm(not a1.isId) | 
					
						
							|  |  |  |         self.confirm(a2.isId) | 
					
						
							|  |  |  |         self.confirm(not a3.isId) | 
					
						
							|  |  |  |         self.confirm(doc.getElementById("v") is None) | 
					
						
							|  |  |  |         # renaming an attribute should not affect its ID-ness: | 
					
						
							|  |  |  |         doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and a2.isId) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testSetIdAttributeNode(self): | 
					
						
							|  |  |  |         NS1 = "http://xml.python.org/ns1" | 
					
						
							|  |  |  |         NS2 = "http://xml.python.org/ns2" | 
					
						
							|  |  |  |         doc = parseString("<doc" | 
					
						
							|  |  |  |                           " xmlns:ns1='" + NS1 + "'" | 
					
						
							|  |  |  |                           " xmlns:ns2='" + NS2 + "'" | 
					
						
							|  |  |  |                           " ns1:a1='v' ns2:a2='w'/>") | 
					
						
							|  |  |  |         e = doc.documentElement | 
					
						
							|  |  |  |         a1 = e.getAttributeNodeNS(NS1, "a1") | 
					
						
							|  |  |  |         a2 = e.getAttributeNodeNS(NS2, "a2") | 
					
						
							|  |  |  |         self.confirm(doc.getElementById("v") is None | 
					
						
							|  |  |  |                 and not a1.isId | 
					
						
							|  |  |  |                 and not a2.isId) | 
					
						
							|  |  |  |         e.setIdAttributeNode(a1) | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("v")) | 
					
						
							|  |  |  |                 and a1.isId | 
					
						
							|  |  |  |                 and not a2.isId) | 
					
						
							|  |  |  |         e.setIdAttributeNode(a2) | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("v")) | 
					
						
							|  |  |  |                 and e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and a1.isId | 
					
						
							|  |  |  |                 and a2.isId) | 
					
						
							|  |  |  |         # replace the a1 node; the new node should *not* be an ID | 
					
						
							|  |  |  |         a3 = doc.createAttributeNS(NS1, "a1") | 
					
						
							|  |  |  |         a3.value = "v" | 
					
						
							|  |  |  |         e.setAttributeNode(a3) | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("w"))) | 
					
						
							|  |  |  |         self.confirm(not a1.isId) | 
					
						
							|  |  |  |         self.confirm(a2.isId) | 
					
						
							|  |  |  |         self.confirm(not a3.isId) | 
					
						
							|  |  |  |         self.confirm(doc.getElementById("v") is None) | 
					
						
							|  |  |  |         # renaming an attribute should not affect its ID-ness: | 
					
						
							|  |  |  |         doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an") | 
					
						
							|  |  |  |         self.confirm(e.isSameNode(doc.getElementById("w")) | 
					
						
							|  |  |  |                 and a2.isId) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testPickledDocument(self): | 
					
						
							|  |  |  |         doc = parseString("<?xml version='1.0' encoding='us-ascii'?>\n" | 
					
						
							|  |  |  |                     "<!DOCTYPE doc PUBLIC 'http://xml.python.org/public'" | 
					
						
							|  |  |  |                     " 'http://xml.python.org/system' [\n" | 
					
						
							|  |  |  |                     "  <!ELEMENT e EMPTY>\n" | 
					
						
							|  |  |  |                     "  <!ENTITY ent SYSTEM 'http://xml.python.org/entity'>\n" | 
					
						
							|  |  |  |                     "]><doc attr='value'> text\n" | 
					
						
							|  |  |  |                     "<?pi sample?> <!-- comment --> <e/> </doc>") | 
					
						
							|  |  |  |         s = pickle.dumps(doc) | 
					
						
							|  |  |  |         doc2 = pickle.loads(s) | 
					
						
							|  |  |  |         stack = [(doc, doc2)] | 
					
						
							|  |  |  |         while stack: | 
					
						
							|  |  |  |             n1, n2 = stack.pop() | 
					
						
							|  |  |  |             self.confirm(n1.nodeType == n2.nodeType | 
					
						
							|  |  |  |                     and len(n1.childNodes) == len(n2.childNodes) | 
					
						
							|  |  |  |                     and n1.nodeName == n2.nodeName | 
					
						
							|  |  |  |                     and not n1.isSameNode(n2) | 
					
						
							|  |  |  |                     and not n2.isSameNode(n1)) | 
					
						
							|  |  |  |             if n1.nodeType == Node.DOCUMENT_TYPE_NODE: | 
					
						
							|  |  |  |                 len(n1.entities) | 
					
						
							|  |  |  |                 len(n2.entities) | 
					
						
							|  |  |  |                 len(n1.notations) | 
					
						
							|  |  |  |                 len(n2.notations) | 
					
						
							|  |  |  |                 self.confirm(len(n1.entities) == len(n2.entities) | 
					
						
							|  |  |  |                         and len(n1.notations) == len(n2.notations)) | 
					
						
							|  |  |  |                 for i in range(len(n1.notations)): | 
					
						
							|  |  |  |                     no1 = n1.notations.item(i) | 
					
						
							|  |  |  |                     no2 = n1.notations.item(i) | 
					
						
							|  |  |  |                     self.confirm(no1.name == no2.name | 
					
						
							|  |  |  |                             and no1.publicId == no2.publicId | 
					
						
							|  |  |  |                             and no1.systemId == no2.systemId) | 
					
						
							|  |  |  |                     statck.append((no1, no2)) | 
					
						
							|  |  |  |                 for i in range(len(n1.entities)): | 
					
						
							|  |  |  |                     e1 = n1.entities.item(i) | 
					
						
							|  |  |  |                     e2 = n2.entities.item(i) | 
					
						
							|  |  |  |                     self.confirm(e1.notationName == e2.notationName | 
					
						
							|  |  |  |                             and e1.publicId == e2.publicId | 
					
						
							|  |  |  |                             and e1.systemId == e2.systemId) | 
					
						
							|  |  |  |                     stack.append((e1, e2)) | 
					
						
							|  |  |  |             if n1.nodeType != Node.DOCUMENT_NODE: | 
					
						
							|  |  |  |                 self.confirm(n1.ownerDocument.isSameNode(doc) | 
					
						
							|  |  |  |                         and n2.ownerDocument.isSameNode(doc2)) | 
					
						
							|  |  |  |             for i in range(len(n1.childNodes)): | 
					
						
							|  |  |  |                 stack.append((n1.childNodes[i], n2.childNodes[i])) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-23 15:18:28 +00:00
										 |  |  |     def testSerializeCommentNodeWithDoubleHyphen(self): | 
					
						
							|  |  |  |         doc = create_doc_without_doctype() | 
					
						
							|  |  |  |         doc.appendChild(doc.createComment("foo--bar")) | 
					
						
							|  |  |  |         self.assertRaises(ValueError, doc.toxml) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  | def test_main(): | 
					
						
							|  |  |  |     run_unittest(MinidomTest) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-28 23:34:06 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |