From f742d3417905e5a0f4785f9684c3a7427e139ca7 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Thu, 7 Mar 2002 00:05:35 +0000 Subject: [PATCH] fixed xmlReconciliateNs(), added a Python test/example for inter-document * tree.c python/tests/Makefile.am python/tests/cutnpaste.py: fixed xmlReconciliateNs(), added a Python test/example for inter-document cut'n paste * python/libxml.py: fixed node.doc on document nodes and added xpathEval() onto node objects Daniel --- ChangeLog | 8 +++++++ python/libxml.py | 23 ++++++++++++++++--- python/tests/Makefile.am | 1 + python/tests/cutnpaste.py | 48 +++++++++++++++++++++++++++++++++++++++ tree.c | 15 ++++++++++-- 5 files changed, 90 insertions(+), 5 deletions(-) create mode 100755 python/tests/cutnpaste.py diff --git a/ChangeLog b/ChangeLog index 553e967a..c2190b25 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Mar 7 01:02:37 CET 2002 Daniel Veillard + + * tree.c python/tests/Makefile.am python/tests/cutnpaste.py: + fixed xmlReconciliateNs(), added a Python test/example for + inter-document cut'n paste + * python/libxml.py: fixed node.doc on document nodes and added + xpathEval() onto node objects + Wed Mar 6 22:38:03 CET 2002 Daniel Veillard * HTMLtree.c: fixed some htmlSetMetaEncoding() problems diff --git a/python/libxml.py b/python/libxml.py index 8d994662..3c15102c 100644 --- a/python/libxml.py +++ b/python/libxml.py @@ -181,8 +181,11 @@ class xmlCore: elif attr == "doc": ret = libxml2mod.doc(self._o) if ret == None: - return None - return xmlDoc(_doc=ret) + if self.type == "document_xml" or self.type == "document_html": + return xmlDoc(_obj=self._o) + else: + return None + return xmlDoc(_obj=ret) raise AttributeError,attr # @@ -235,7 +238,7 @@ class xmlCore: ret = libxml2mod.doc(self._o) if ret == None: return None - return xmlDoc(_doc=ret) + return xmlDoc(_obj=ret) def free(self): libxml2mod.freeDoc(self._o) @@ -250,6 +253,20 @@ class xmlCore: def saveTo(self, file, encoding = None, format = 0): return libxml2mod.saveNodeTo(self._o, file, encoding, format) + # + # Selecting nodes using XPath, a bit slow because the context + # is allocated/freed every time but convenient. + # + def xpathEval(self, expr): + doc = self.doc + if doc == None: + return None + ctxt = doc.xpathNewContext() + ctxt.setContextNode(self) + res = ctxt.xpathEval(expr) + ctxt.xpathFreeContext() + return res + # # converters to present a nicer view of the XPath returns # diff --git a/python/tests/Makefile.am b/python/tests/Makefile.am index b5e2c43f..b8ee7b73 100644 --- a/python/tests/Makefile.am +++ b/python/tests/Makefile.am @@ -11,6 +11,7 @@ PYTESTS= \ serialize.py\ validate.py \ tstURI.py \ + cutnpaste.py\ xpathret.py \ xpath.py diff --git a/python/tests/cutnpaste.py b/python/tests/cutnpaste.py new file mode 100755 index 00000000..0f9665a9 --- /dev/null +++ b/python/tests/cutnpaste.py @@ -0,0 +1,48 @@ +#!/usr/bin/python -u +import sys +import libxml2 + +# Memory debug specific +libxml2.debugMemory(1) + +# +# Testing XML document serialization +# +source = libxml2.parseDoc(""" + + + + + +""") + +target = libxml2.parseDoc(""" +""") + +fragment = source.xpathEval("//*[name()='fragment']")[0] +dest = target.getRootElement() + +# do a cut and paste operation +fragment.unlinkNode() +dest.addChild(fragment) +# do the namespace fixup +dest.reconciliateNs(target) + +# The source tree can be freed at that point +source.freeDoc() + +# check the resulting tree +str = dest.serialize() +if str != """""": + print "reconciliateNs() failed" + sys.exit(1) +target.freeDoc() + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() diff --git a/tree.c b/tree.c index 3bd3456a..3764f0eb 100644 --- a/tree.c +++ b/tree.c @@ -4515,11 +4515,18 @@ xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) { * Find a close prefix which is not already in use. * Let's strip namespace prefixes longer than 20 chars ! */ - sprintf((char *) prefix, "%.20s", ns->prefix); + if (ns->prefix == NULL) + sprintf((char *) prefix, "default"); + else + sprintf((char *) prefix, "%.20s", ns->prefix); + def = xmlSearchNs(doc, tree, prefix); while (def != NULL) { if (counter > 1000) return(NULL); - sprintf((char *) prefix, "%.20s%d", ns->prefix, counter++); + if (ns->prefix == NULL) + sprintf((char *) prefix, "default%d", counter++); + else + sprintf((char *) prefix, "%.20s%d", ns->prefix, counter++); def = xmlSearchNs(doc, tree, prefix); } @@ -4721,6 +4728,10 @@ xmlReconciliateNs(xmlDocPtr doc, xmlNodePtr tree) { } else break; } + if (oldNs != NULL) + xmlFree(oldNs); + if (newNs != NULL) + xmlFree(newNs); return(ret); }