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:
parent
4e0e297468
commit
f742d34179
@ -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>
|
Wed Mar 6 22:38:03 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* HTMLtree.c: fixed some htmlSetMetaEncoding() problems
|
* HTMLtree.c: fixed some htmlSetMetaEncoding() problems
|
||||||
|
@ -181,8 +181,11 @@ class xmlCore:
|
|||||||
elif attr == "doc":
|
elif attr == "doc":
|
||||||
ret = libxml2mod.doc(self._o)
|
ret = libxml2mod.doc(self._o)
|
||||||
if ret == None:
|
if ret == None:
|
||||||
return None
|
if self.type == "document_xml" or self.type == "document_html":
|
||||||
return xmlDoc(_doc=ret)
|
return xmlDoc(_obj=self._o)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
return xmlDoc(_obj=ret)
|
||||||
raise AttributeError,attr
|
raise AttributeError,attr
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -235,7 +238,7 @@ class xmlCore:
|
|||||||
ret = libxml2mod.doc(self._o)
|
ret = libxml2mod.doc(self._o)
|
||||||
if ret == None:
|
if ret == None:
|
||||||
return None
|
return None
|
||||||
return xmlDoc(_doc=ret)
|
return xmlDoc(_obj=ret)
|
||||||
def free(self):
|
def free(self):
|
||||||
libxml2mod.freeDoc(self._o)
|
libxml2mod.freeDoc(self._o)
|
||||||
|
|
||||||
@ -250,6 +253,20 @@ class xmlCore:
|
|||||||
def saveTo(self, file, encoding = None, format = 0):
|
def saveTo(self, file, encoding = None, format = 0):
|
||||||
return libxml2mod.saveNodeTo(self._o, file, encoding, format)
|
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
|
# converters to present a nicer view of the XPath returns
|
||||||
#
|
#
|
||||||
|
@ -11,6 +11,7 @@ PYTESTS= \
|
|||||||
serialize.py\
|
serialize.py\
|
||||||
validate.py \
|
validate.py \
|
||||||
tstURI.py \
|
tstURI.py \
|
||||||
|
cutnpaste.py\
|
||||||
xpathret.py \
|
xpathret.py \
|
||||||
xpath.py
|
xpath.py
|
||||||
|
|
||||||
|
48
python/tests/cutnpaste.py
Executable file
48
python/tests/cutnpaste.py
Executable 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()
|
15
tree.c
15
tree.c
@ -4515,11 +4515,18 @@ xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) {
|
|||||||
* Find a close prefix which is not already in use.
|
* Find a close prefix which is not already in use.
|
||||||
* Let's strip namespace prefixes longer than 20 chars !
|
* 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);
|
def = xmlSearchNs(doc, tree, prefix);
|
||||||
while (def != NULL) {
|
while (def != NULL) {
|
||||||
if (counter > 1000) return(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);
|
def = xmlSearchNs(doc, tree, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4721,6 +4728,10 @@ xmlReconciliateNs(xmlDocPtr doc, xmlNodePtr tree) {
|
|||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (oldNs != NULL)
|
||||||
|
xmlFree(oldNs);
|
||||||
|
if (newNs != NULL)
|
||||||
|
xmlFree(newNs);
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user