helly Mon Oct 31 14:09:13 2005 EDT Added files: /php-src/ext/simplexml/tests 025.phpt
Modified files: /php-src/ext/simplexml simplexml.c Log: - Add functions to check for registered/in use namespaces http://cvs.php.net/diff.php/php-src/ext/simplexml/simplexml.c?r1=1.170&r2=1.171&ty=u Index: php-src/ext/simplexml/simplexml.c diff -u php-src/ext/simplexml/simplexml.c:1.170 php-src/ext/simplexml/simplexml.c:1.171 --- php-src/ext/simplexml/simplexml.c:1.170 Sun Oct 30 15:37:07 2005 +++ php-src/ext/simplexml/simplexml.c Mon Oct 31 14:09:10 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: simplexml.c,v 1.170 2005/10/30 20:37:07 helly Exp $ */ +/* $Id: simplexml.c,v 1.171 2005/10/31 19:09:10 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -896,10 +896,7 @@ } /* }}} */ -/* {{{ sxe_objects_compare() - */ -static int -sxe_objects_compare(zval *object1, zval *object2 TSRMLS_DC) +static int sxe_objects_compare(zval *object1, zval *object2 TSRMLS_DC) /* {{{ */ { php_sxe_object *sxe1; php_sxe_object *sxe2; @@ -1103,6 +1100,99 @@ } /* }}} */ +static void sxe_add_namespaces(php_sxe_object *sxe, xmlNodePtr node, zend_bool recursive, zval *return_value TSRMLS_DC) /* {{{ */ +{ + xmlAttrPtr attr; + + if (node->ns) { + add_assoc_string(return_value, (char*)node->ns->prefix, (char*)node->ns->href, 1); + } + + attr = node->properties; + while (attr) { + if (attr->ns) { + add_assoc_string(return_value, (char*)attr->ns->prefix, (char*)attr->ns->href, 1); + } + attr = attr->next; + } + + if (recursive) { + node = node->children; + while (node) { + sxe_add_namespaces(sxe, node, recursive, return_value TSRMLS_CC); + node = node->next; + } + } +} /* }}} */ + +/* {{{ proto string SimpleXMLElement::getNamespaces([bool recursve]) + Return all namespaces in use */ +SXE_METHOD(getNamespaces) +{ + zend_bool recursive = 0; + php_sxe_object *sxe; + xmlNodePtr node; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &recursive) == FAILURE) { + return; + } + + array_init(return_value); + + sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + GET_NODE(sxe, node); + node = php_sxe_get_first_node(sxe, node TSRMLS_CC); + + while (node) { + SKIP_TEXT(node) + if (node->type == XML_ELEMENT_NODE) { + sxe_add_namespaces(sxe, node, recursive, return_value TSRMLS_CC); + } else if (node->ns) { + add_assoc_string(return_value, (char*)node->ns->prefix, (char*)node->ns->href, 1); + } +next_iter: + node = node->next; + } +} +/* }}} */ + +static void sxe_add_registered_namespaces(php_sxe_object *sxe, xmlDocPtr doc, xmlNodePtr node, zend_bool recursive, zval *return_value TSRMLS_DC) /* {{{ */ +{ + xmlNsPtr *ns = xmlGetNsList(doc, node); + + while (ns && ns[0]) { + add_assoc_string(return_value, (char*)ns[0]->prefix, (char*)ns[0]->href, 1); + ns++; + } + + if (recursive) { + node = node->children; + while (node) { + sxe_add_registered_namespaces(sxe, doc, node, recursive, return_value TSRMLS_CC); + node = node->next; + } + } +} + +/* {{{ proto string SimpleXMLElement::getDocNamespaces([bool recursve]) + Return all namespaces registered with document */ +SXE_METHOD(getDocNamespaces) +{ + zend_bool recursive = 0; + php_sxe_object *sxe; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &recursive) == FAILURE) { + return; + } + + array_init(return_value); + + sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + + sxe_add_registered_namespaces(sxe, (xmlDocPtr)sxe->document->ptr, xmlDocGetRootElement((xmlDocPtr)sxe->document->ptr), recursive, return_value TSRMLS_CC); +} +/* }}} */ + /* {{{ proto object SimpleXMLElement::children() Finds children of given node */ SXE_METHOD(children) @@ -1204,7 +1294,7 @@ int rv; sxe = php_sxe_fetch_object(readobj TSRMLS_CC); - + if (type == IS_BOOL) { node = php_sxe_get_first_node(sxe, NULL TSRMLS_CC); INIT_PZVAL(writeobj); @@ -1830,9 +1920,11 @@ SXE_ME(__construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) /* must be called */ SXE_ME(asXML, NULL, ZEND_ACC_PUBLIC) SXE_ME(xpath, NULL, ZEND_ACC_PUBLIC) - SXE_ME(registerXPathNamespace, NULL, ZEND_ACC_PUBLIC) + SXE_ME(registerXPathNamespace, NULL, ZEND_ACC_PUBLIC) SXE_ME(attributes, NULL, ZEND_ACC_PUBLIC) - SXE_ME(children, NULL, ZEND_ACC_PUBLIC) + SXE_ME(children, NULL, ZEND_ACC_PUBLIC) + SXE_ME(getNamespaces, NULL, ZEND_ACC_PUBLIC) + SXE_ME(getDocNamespaces, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -1885,7 +1977,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "Simplexml support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.170 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.171 $"); php_info_print_table_row(2, "Schema support", #ifdef LIBXML_SCHEMAS_ENABLED "enabled"); http://cvs.php.net/co.php/php-src/ext/simplexml/tests/025.phpt?r=1.1&p=1 Index: php-src/ext/simplexml/tests/025.phpt +++ php-src/ext/simplexml/tests/025.phpt --TEST-- SimpleXML: getting namespaces --SKIPIF-- <?php if (!extension_loaded("simplexml")) print "skip"; ?> --FILE-- <?php $xml =<<<EOF <?xml version='1.0'?> <xhtml:html xmlns:html='http://www.w3.org/1999/xhtml' xmlns:xhtml='http://www.w3.org/TR/REC-html40'> <xhtml:head><xhtml:title>bla</xhtml:title></xhtml:head> <xhtml:body html:title="b"> <html:h1>bla</html:h1> <foo:bar xmlns:foo='foobar' xmlns:baz='foobarbaz'/> </xhtml:body> </xhtml:html> EOF; $sxe = simplexml_load_string($xml); var_dump($sxe->getNamespaces()); var_dump($sxe->getNamespaces(true)); var_dump($sxe->getDocNamespaces()); var_dump($sxe->getDocNamespaces(true)); ?> ===DONE=== --EXPECTF-- array(1) { ["xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" } array(3) { ["xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" ["html"]=> string(28) "http://www.w3.org/1999/xhtml" ["foo"]=> string(6) "foobar" } array(2) { ["html"]=> string(28) "http://www.w3.org/1999/xhtml" ["xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" } array(4) { ["html"]=> string(28) "http://www.w3.org/1999/xhtml" ["xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" ["foo"]=> string(6) "foobar" ["baz"]=> string(9) "foobarbaz" } ===DONE=== --UEXPECTF-- array(1) { [u"xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" } array(3) { [u"xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" [u"html"]=> string(28) "http://www.w3.org/1999/xhtml" [u"foo"]=> string(6) "foobar" } array(2) { [u"html"]=> string(28) "http://www.w3.org/1999/xhtml" [u"xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" } array(4) { [u"html"]=> string(28) "http://www.w3.org/1999/xhtml" [u"xhtml"]=> string(31) "http://www.w3.org/TR/REC-html40" [u"foo"]=> string(6) "foobar" [u"baz"]=> string(9) "foobarbaz" } ===DONE=== -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php