Re: cvs: php-src /ext/simplexml simplexml.c /ext/simplexml/tests profile12.phpt
| From: | Adam Maccabee Trachtenberg | Date: | Fri, 14 Apr 2006 18:07:10 +0000 |
| Subject: | Re: cvs: php-src /ext/simplexml simplexml.c /ext/simplexml/tests profile12.phpt | ||
| References: | 1 2 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-37812@lists.php.net to get a copy of this message | ||
I think using namespace URI will also help us out with default
namespaces because they don't have a ns prefix.
-adam
On Fri, 14 Apr 2006, Rob Richards wrote:
> Hi Marcus,
>
> I think it would be better to speficy namespace URI rather than prefix.
> Prefix can be anything, so unless you know what was used, you need to
> use the new namespace methods (which are primarily debug functions). It
> is more common to known the URI than prefix.
>
> I havent tried the changes yet, but is it required to specify the
> namespace for a document element in a namespace or when loading does it
> automatically set the namespace scope based on the namespace of the doc
> element?
>
> Rob
>
> Marcus Boerger wrote:
>
> >helly Fri Apr 14 14:07:51 2006 UTC
> >
> > Added files:
> > /php-src/ext/simplexml/tests profile12.phpt
> >
> > Modified files:
> > /php-src/ext/simplexml simplexml.c
> > Log:
> > - Allow access to namespaced root by specifying prefix on creation
> > - Fix access to non namespaced root
> >
> >
>
> >>http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/simplexml.c?r1=1.204&r2=1.205&diff_format=u
> >Index: php-src/ext/simplexml/simplexml.c
> >diff -u php-src/ext/simplexml/simplexml.c:1.204 php-src/ext/simplexml/simplexml.c:1.205
> >--- php-src/ext/simplexml/simplexml.c:1.204 Fri Apr 14 12:18:15 2006
> >+++ php-src/ext/simplexml/simplexml.c Fri Apr 14 14:07:51 2006
> >@@ -18,7 +18,7 @@
> > +----------------------------------------------------------------------+
> > */
> >
> >-/* $Id: simplexml.c,v 1.204 2006/04/14 12:18:15 helly Exp $ */
> >+/* $Id: simplexml.c,v 1.205 2006/04/14 14:07:51 helly Exp $ */
> >
> > #ifdef HAVE_CONFIG_H
> > #include "config.h"
> >@@ -69,7 +69,7 @@
> > if (name) {
> > subnode->iter.name = xmlStrdup(name);
> > }
> >- if (prefix) {
> >+ if (prefix && *prefix) {
> > subnode->iter.nsprefix = xmlStrdup(prefix);
> > }
> >
> >@@ -122,7 +122,7 @@
> > return 1;
> > }
> >
> >- if (node->ns && !xmlStrcmp(node->ns->href, name)) {
> >+ if (node->ns && (/*!xmlStrcmp(node->ns->prefix, name) ||*/
> >!xmlStrcmp(node->ns->href, name))) {
> > return 1;
> > }
> >
> >@@ -1816,7 +1816,7 @@
> > }
> > /* }}} */
> >
> >-/* {{{ proto simplemxml_element simplexml_load_file(string filename [, string class_name
> >[, int options]])
> >+/* {{{ proto simplemxml_element simplexml_load_file(string filename [, string class_name
> >[, int options [, string ns]]])
> > Load a filename and return a simplexml_element object to allow for processing */
> > PHP_FUNCTION(simplexml_load_file)
> > {
> >@@ -1824,12 +1824,12 @@
> > char *filename;
> > int filename_len;
> > xmlDocPtr docp;
> >- char *classname = "";
> >- int classname_len = 0;
> >+ char *classname = NULL, *ns = NULL;
> >+ int classname_len = 0, ns_len = 0;
> > long options = 0;
> > zend_class_entry *ce= sxe_class_entry;
> >
> >- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sl", &filename,
> >&filename_len, &classname, &classname_len, &options) == FAILURE) {
> >+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sls", &filename,
> >&filename_len, &classname, &classname_len, &options, &ns, &ns_len) ==
> >FAILURE) {
> > return;
> > }
> >
> >@@ -1848,6 +1848,7 @@
> > }
> >
> > sxe = php_sxe_object_new(ce TSRMLS_CC);
> >+ sxe->iter.nsprefix = ns_len ? xmlStrdup(ns) : NULL;
> > php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp TSRMLS_CC);
> > php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, xmlDocGetRootElement(docp),
> > NULL TSRMLS_CC);
> >
> >@@ -1856,7 +1857,7 @@
> > }
> > /* }}} */
> >
> >-/* {{{ proto simplemxml_element simplexml_load_string(string data [, string class_name [,
> >int options]])
> >+/* {{{ proto simplemxml_element simplexml_load_string(string data [, string class_name [,
> >int options [, string ns]]])
> > Load a string and return a simplexml_element object to allow for processing */
> > PHP_FUNCTION(simplexml_load_string)
> > {
> >@@ -1864,12 +1865,12 @@
> > char *data;
> > int data_len;
> > xmlDocPtr docp;
> >- char *classname = "";
> >- int classname_len = 0;
> >+ char *classname = NULL, *ns = NULL;
> >+ int classname_len = 0, ns_len = 0;
> > long options = 0;
> > zend_class_entry *ce= sxe_class_entry;
> >
> >- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sl", &data,
> >&data_len, &classname, &classname_len, &options) == FAILURE) {
> >+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sls", &data,
> >&data_len, &classname, &classname_len, &options, &ns, &ns_len) == FAILURE) {
> > return;
> > }
> >
> >@@ -1888,6 +1889,7 @@
> > }
> >
> > sxe = php_sxe_object_new(ce TSRMLS_CC);
> >+ sxe->iter.nsprefix = ns_len ? xmlStrdup(ns) : NULL;
> > php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp TSRMLS_CC);
> > php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, xmlDocGetRootElement(docp),
> > NULL TSRMLS_CC);
> >
> >@@ -1897,19 +1899,19 @@
> > /* }}} */
> >
> >
> >-/* {{{ proto SimpleXMLElement::__construct(string data [, int options [, bool
> >data_is_url]])
> >+/* {{{ proto SimpleXMLElement::__construct(string data [, int options [, bool data_is_url
> >[, string ns]]])
> > SimpleXMLElement constructor */
> > SXE_METHOD(__construct)
> > {
> > php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
> >- char *data;
> >- int data_len;
> >+ char *data, *ns = NULL;
> >+ int data_len, *ns_len = 0;
> > xmlDocPtr docp;
> > long options = 0;
> > zend_bool is_url = 0;
> >
> > php_set_error_handling(EH_THROW, zend_exception_get_default(TSRMLS_C) TSRMLS_CC);
> >- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lb", &data,
> >&data_len, &options, &is_url) == FAILURE) {
> >+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lbs", &data,
> >&data_len, &options, &is_url, &ns, &ns_len) == FAILURE) {
> > php_std_error_handling();
> > return;
> > }
> >@@ -1924,6 +1926,7 @@
> > return;
> > }
> >
> >+ sxe->iter.nsprefix = ns_len ? xmlStrdup(ns) : NULL;
> > php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp TSRMLS_CC);
> > php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, xmlDocGetRootElement(docp),
> > NULL TSRMLS_CC);
> > }
> >@@ -2264,7 +2267,7 @@
> > {
> > php_info_print_table_start();
> > php_info_print_table_header(2, "Simplexml support", "enabled");
> >- php_info_print_table_row(2, "Revision", "$Revision: 1.204 $");
> >+ php_info_print_table_row(2, "Revision", "$Revision: 1.205 $");
> > php_info_print_table_row(2, "Schema support",
> > #ifdef LIBXML_SCHEMAS_ENABLED
> > "enabled");
> >
>
> >>http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/tests/profile12.phpt?view=markup&rev=1.1
> >Index: php-src/ext/simplexml/tests/profile12.phpt
> >+++ php-src/ext/simplexml/tests/profile12.phpt
> >--TEST--
> >SimpleXML [profile]: Accessing namespaced root and non namespaced children
> >--FILE--
> ><?php
> >
> >$xml =<<<EOF
> ><?xml version="1.0" encoding="utf-8"?>
> ><soap:Envelope
>
> >>xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
> >xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"$Â
> >ˆÄK“tœÒa¥!µåt
> >xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> >
> >
> ><soap:Body>
> ><businessList foo="bar">
> ><businessInfo businessKey="bla"/>
> ></businessList>
> ></soap:Body>
> ></soap:Envelope>
> >EOF;
> >
> >$sxe = simplexml_load_string($xml, NULL, 0, 'soap');
> >$nsl = $sxe->getNamespaces();
> >var_dump($nsl);
> >
> >$sxe = simplexml_load_string($xml, NULL, 0, $nsl['soap']);
> >var_dump($sxe->Body);
> >var_dump($sxe->Body->children(''));
> >var_dump($sxe->Body->children('')->businessList);
> >
> >?>
> >===DONE===
> >--EXPECTF--
> >array(1) {
> > ["soap"]=>
> > string(41)
> > "http://schemas.xmlsoap.org/soap/envelope/"
> >}
> >object(SimpleXMLElement)#%d (0) {
> >}
> >object(SimpleXMLElement)#%d (1) {
> > ["businessInfo"]=>
> > object(SimpleXMLElement)#%d (1) {
> > ["@attributes"]=>
> > array(1) {
> > ["businessKey"]=>
> > string(3) "bla"
> > }
> > }
> >}
> >object(SimpleXMLElement)#%d (2) {
> > ["@attributes"]=>
> > array(1) {
> > ["foo"]=>
> > string(3) "bar"
> > }
> > ["businessInfo"]=>
> > object(SimpleXMLElement)#%d (1) {
> > ["@attributes"]=>
> > array(1) {
> > ["businessKey"]=>
> > string(3) "bla"
> > }
> > }
> >}
> >===DONE===
> >--UEXPECTF--
> >array(1) {
> > [u"soap"]=>
> > string(41)
> > "http://schemas.xmlsoap.org/soap/envelope/"
> >}
> >object(SimpleXMLElement)#%d (0) {
> >}
> >object(SimpleXMLElement)#%d (1) {
> > [u"businessInfo"]=>
> > object(SimpleXMLElement)#%d (1) {
> > [u"@attributes"]=>
> > array(1) {
> > [u"businessKey"]=>
> > unicode(3) "bla"
> > }
> > }
> >}
> >object(SimpleXMLElement)#%d (2) {
> > [u"@attributes"]=>
> > array(1) {
> > [u"foo"]=>
> > unicode(3) "bar"
> > }
> > [u"businessInfo"]=>
> > object(SimpleXMLElement)#%d (1) {
> > [u"@attributes"]=>
> > array(1) {
> > [u"businessKey"]=>
> > unicode(3) "bla"
> > }
> > }
> >}
> >===DONE===
> >
> >
> >
>
>
--
adam@trachtenberg.com | http://www.trachtenberg.com
author of o'reilly's "upgrading to php 5" and "php cookbook"
avoid the holiday rush, buy your copies today!