1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-10-26 20:25:14 +03:00

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
This commit is contained in:
Daniel Veillard 2002-03-07 00:05:35 +00:00
parent 4e0e297468
commit f742d34179
5 changed files with 90 additions and 5 deletions

View File

@ -1,3 +1,11 @@
Thu Mar 7 01:02:37 CET 2002 Daniel Veillard <daniel@veillard.com>
* 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 <daniel@veillard.com>
* HTMLtree.c: fixed some htmlSetMetaEncoding() problems

View File

@ -181,8 +181,11 @@ class xmlCore:
elif attr == "doc":
ret = libxml2mod.doc(self._o)
if ret == None:
if self.type == "document_xml" or self.type == "document_html":
return xmlDoc(_obj=self._o)
else:
return None
return xmlDoc(_doc=ret)
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
#

View File

@ -11,6 +11,7 @@ PYTESTS= \
serialize.py\
validate.py \
tstURI.py \
cutnpaste.py\
xpathret.py \
xpath.py

48
python/tests/cutnpaste.py Executable file
View File

@ -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("""<?xml version="1.0"?>
<root xmlns:foo="http://example.org/foo"
xmlns:bar="http://example.org/bar">
<include xmlns="http://example.org/include">
<fragment><foo:elem bar="tricky"/></fragment>
</include>
</root>
""")
target = libxml2.parseDoc("""<?xml version="1.0"?>
<root xmlns:foobar="http://example.org/bar"/>""")
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 != """<root xmlns:foobar="http://example.org/bar" xmlns:default="http://example.org/include" xmlns:foo="http://example.org/foo"><default:fragment><foo:elem bar="tricky"/></default:fragment></root>""":
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()

11
tree.c
View File

@ -4515,10 +4515,17 @@ 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 !
*/
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);
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);
}