diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2002-03-01 16:14:17 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2002-03-01 16:14:17 +0000 |
commit | 79426f2b4687db33bce9751dec31b7caa9369b6e (patch) | |
tree | 73d1172e74663f96686d60b49e850c7a3cb6a3ed /python | |
parent | a94ec6ff13d9617ff22e790cef82208e7d1bd375 (diff) | |
download | libxml2-79426f2b4687db33bce9751dec31b7caa9369b6e.tar.gz |
added the possibility of returning nodesets from XPath extension functions
* python/types.c python/tests/Makefile.am python/tests/xpathret.py:
added the possibility of returning nodesets from XPath extension
functions written in Python
Daniel
Diffstat (limited to 'python')
-rw-r--r-- | python/tests/Makefile.am | 1 | ||||
-rwxr-xr-x | python/tests/xpathret.py | 57 | ||||
-rw-r--r-- | python/types.c | 26 |
3 files changed, 81 insertions, 3 deletions
diff --git a/python/tests/Makefile.am b/python/tests/Makefile.am index f865c6b6..e836fd5b 100644 --- a/python/tests/Makefile.am +++ b/python/tests/Makefile.am @@ -10,6 +10,7 @@ PYTESTS= \ error.py \ validate.py \ tstURI.py \ + xpathret.py \ xpath.py XMLS= \ diff --git a/python/tests/xpathret.py b/python/tests/xpathret.py new file mode 100755 index 00000000..2b5576a7 --- /dev/null +++ b/python/tests/xpathret.py @@ -0,0 +1,57 @@ +#!/usr/bin/python -u +import sys +import libxml2 + +#memory debug specific +libxml2.debugMemory(1) + +# +# A document hosting the nodes returned from the extension function +# +mydoc = libxml2.newDoc("1.0") + +def foo(ctx, str): + global mydoc + + # + # test returning a node set works as expected + # + parent = mydoc.newDocNode(None, 'p', None) + mydoc.addChild(parent) + node = mydoc.newDocText(str) + parent.addChild(node) + return [parent] + +doc = libxml2.parseFile("tst.xml") +ctxt = doc.xpathNewContext() +libxml2.registerXPathFunction(ctxt._o, "foo", None, foo) +res = ctxt.xpathEval("foo('hello')") +if type(res) != type([]): + print "Failed to return a nodeset" + sys.exit(1) +if len(res) != 1: + print "Unexpected nodeset size" + sys.exit(1) +node = res[0] +if node.name != 'p': + print "Unexpected nodeset element result" + sys.exit(1) +node = node.children +if node.type != 'text': + print "Unexpected nodeset element children type" + sys.exit(1) +if node.content != 'hello': + print "Unexpected nodeset element children content" + sys.exit(1) + +doc.freeDoc() +mydoc.freeDoc() +ctxt.xpathFreeContext() + +#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/python/types.c b/python/types.c index 81865dfc..12562450 100644 --- a/python/types.c +++ b/python/types.c @@ -372,10 +372,30 @@ libxml_xmlXPathObjectPtrConvert(PyObject * obj) { for (i = 0;i < PyList_Size(obj);i++) { node = PyList_GetItem(obj, i); - if ((node == NULL) || (node->ob_type == NULL) || - (!PyCObject_Check(node))) + if ((node == NULL) || (node->ob_type == NULL)) continue; - cur = PyxmlNode_Get(node); + + cur = NULL; + if (PyCObject_Check(node)) { + printf("Got a CObject\n"); + cur = PyxmlNode_Get(node); + } else if (PyInstance_Check(node)) { + PyInstanceObject *inst = (PyInstanceObject *) node; + PyObject *name = inst->in_class->cl_name; + if PyString_Check(name) { + char *type = PyString_AS_STRING(name); + PyObject *wrapper; + + if (!strcmp(type, "xmlNode")) { + wrapper = PyObject_GetAttrString(node, "_o"); + if (wrapper != NULL) { + cur = PyxmlNode_Get(wrapper); + } + } + } + } else { + printf("Unknown object in Python return list\n"); + } if (cur != NULL) { xmlXPathNodeSetAdd(set, cur); } |