Index: simplexml.c =================================================================== RCS file: /repository/php-src/ext/simplexml/simplexml.c,v retrieving revision 1.86 diff -u -r1.86 simplexml.c --- simplexml.c 23 Nov 2003 16:20:57 -0000 1.86 +++ simplexml.c 23 Nov 2003 18:56:17 -0000 @@ -190,6 +190,7 @@ } if (match_ns(sxe, node, name)) { + APPEND_PREV_ELEMENT(counter, value); MAKE_STD_ZVAL(value); _node_as_zval(sxe, node->parent, value TSRMLS_CC); APPEND_CUR_ELEMENT(counter, value); @@ -647,6 +648,15 @@ } /* }}} */ +/* {{{ _xsearch_register_ns() + */ +static void _xsearch_register_ns(char *prefix, xmlXPathContext *xpath, char *href) +{ + xmlXPathRegisterNs(xpath, prefix, href); +} +/* }}} */ + + /* {{{ xsearch() */ SXE_METHOD(xsearch) @@ -656,6 +666,8 @@ char *query; int query_len; int i; + int nsnbr = 0; + xmlNsPtr *ns = NULL; xmlXPathObjectPtr retval; xmlNodeSetPtr result; @@ -673,14 +685,29 @@ sxe->xpath->node = sxe->node->node; + /* Register namespaces added in simplexml_cs_register_ns() */ + xmlHashScan((xmlHashTablePtr) sxe->nsmapptr->nsmap, (xmlHashScanner) _xsearch_register_ns, sxe->xpath); + + /* Add namespaces registered above and ones defined in document using xmlns attributes */ + ns = xmlGetNsList((xmlDocPtr) sxe->document->ptr, (xmlNodePtr) sxe->node->node); + + if (ns != NULL) { + while (ns[nsnbr] != NULL) { + nsnbr++; + } + } + + sxe->xpath->namespaces = ns; + sxe->xpath->nsNr = nsnbr; + retval = xmlXPathEval(query, sxe->xpath); if (!retval) { RETURN_FALSE; } - result = retval->nodesetval; if (!result) { + xmlXPathFreeObject(retval); RETURN_FALSE; } @@ -699,7 +726,9 @@ _node_as_zval(sxe, result->nodeTab[i], value TSRMLS_CC); } add_next_index_zval(return_value, value); - } + } + + xmlXPathFreeObject(retval); } /* }}} */ @@ -812,7 +841,7 @@ sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); - xmlHashAddEntry(sxe->nsmapptr->nsmap, nsvalue, nsname); + xmlHashAddEntry(sxe->nsmapptr->nsmap, nsvalue, xmlStrdup(nsname)); } /* }}} */