helly Sat Feb 25 23:41:06 2006 UTC Added files: /php-src/ext/simplexml/tests 026.phpt 027.phpt
Modified files: /php-src/ext/simplexml simplexml.c Log: - Added ability to add elements by index if such elements already exist - Added SimpleXMLElement::getName() to access the node name # This allows to retrieve the name of the root element which is otherwise # only available by converting the sxe object into a dom object. http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/simplexml.c?r1=1.188&r2=1.189&diff_format=u Index: php-src/ext/simplexml/simplexml.c diff -u php-src/ext/simplexml/simplexml.c:1.188 php-src/ext/simplexml/simplexml.c:1.189 --- php-src/ext/simplexml/simplexml.c:1.188 Fri Feb 24 15:49:13 2006 +++ php-src/ext/simplexml/simplexml.c Sat Feb 25 23:41:06 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: simplexml.c,v 1.188 2006/02/24 15:49:13 helly Exp $ */ +/* $Id: simplexml.c,v 1.189 2006/02/25 23:41:06 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -130,10 +130,10 @@ } /* }}} */ -static xmlNodePtr sxe_get_element_by_offset(php_sxe_object *sxe, long offset, xmlNodePtr node) /* {{{ */ +static xmlNodePtr sxe_get_element_by_offset(php_sxe_object *sxe, long offset, xmlNodePtr node, long *cnt) /* {{{ */ { long nodendx = 0; - + if (sxe->iter.type == SXE_ITER_NONE) { return NULL; } @@ -151,6 +151,10 @@ next_iter: node = node->next; } + + if (cnt) { + *cnt = nodendx; + } return node; } @@ -303,7 +307,7 @@ if (sxe->iter.type == SXE_ITER_CHILD) { node = php_sxe_get_first_node(sxe, node TSRMLS_CC); } - node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node); + node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, NULL); if (node) { _node_as_zval(sxe, node, return_value, SXE_ITER_NONE, NULL, sxe->iter.nsprefix TSRMLS_CC); } @@ -397,6 +401,7 @@ int is_attr = 0; int nodendx = 0; int test = 0; + long cnt; zval tmp_zv, trim_zv; if (!member) { @@ -482,7 +487,7 @@ if (elements) { if (Z_TYPE_P(member) == IS_LONG) { - newnode = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node); + newnode = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, &cnt); if (newnode) { ++counter; } @@ -513,8 +518,15 @@ change_node_zval(newnode, value TSRMLS_CC); } else if (counter > 1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot assign to an array of nodes (duplicate subnodes or attr detected)"); - } else if (elements && !node) { - xmlNewChild(mynode, mynode->ns, name, Z_STRVAL_P(value)); + } else if (elements) { + if (!node) { + xmlNewTextChild(mynode, mynode->ns, name, Z_STRVAL_P(value)); + } else if (Z_TYPE_P(member) == IS_LONG) { + if (cnt < Z_LVAL_P(member)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot add element %s number %ld when only %ld such elements exist", mynode->name, Z_LVAL_P(member), cnt); + } + xmlNewTextChild(mynode->parent, mynode->ns, mynode->name, Z_STRVAL_P(value)); + } } else { if (attribs) { switch (Z_TYPE_P(value)) { @@ -612,7 +624,7 @@ if (sxe->iter.type == SXE_ITER_CHILD) { node = php_sxe_get_first_node(sxe, node TSRMLS_CC); } - node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node); + node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, NULL); } else { zval tmp_zv; @@ -1221,7 +1233,7 @@ } /* }}} */ -/* {{{ proto object SimpleXMLElement::children() +/* {{{ proto object SimpleXMLElement::children([string ns]) Finds children of given node */ SXE_METHOD(children) { @@ -1248,6 +1260,23 @@ } /* }}} */ +/* {{{ proto object SimpleXMLElement::getName() + Finds children of given node */ +SXE_METHOD(getName) +{ + php_sxe_object *sxe; + xmlNodePtr node; + int namelen; + + sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + + GET_NODE(sxe, node); + + namelen = xmlStrlen(node->name); + RETURN_STRINGL((char*)node->name, namelen, 1); +} +/* }}} */ + /* {{{ proto array SimpleXMLElement::attributes([string ns]) Identifies an element's attributes */ SXE_METHOD(attributes) @@ -1985,6 +2014,7 @@ SXE_ME(children, NULL, ZEND_ACC_PUBLIC) SXE_ME(getNamespaces, NULL, ZEND_ACC_PUBLIC) SXE_ME(getDocNamespaces, NULL, ZEND_ACC_PUBLIC) + SXE_ME(getName, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -2037,7 +2067,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "Simplexml support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.188 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.189 $"); php_info_print_table_row(2, "Schema support", #ifdef LIBXML_SCHEMAS_ENABLED "enabled"); http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/tests/026.phpt?view=markup&rev=1.1 Index: php-src/ext/simplexml/tests/026.phpt +++ php-src/ext/simplexml/tests/026.phpt --TEST-- SimpleXML: getName() --SKIPIF-- <?php if (!extension_loaded("simplexml")) print "skip"; ?> --FILE-- <?php $xml =<<<EOF <people> <person>Jane</person> </people> EOF; function traverse_xml($xml, $pad = '') { $name = $xml->getName(); echo "$pad<$name"; foreach($xml->attributes() as $attr => $value) { echo " $attr=\"$value\""; } echo ">" . trim($xml) . "\n"; foreach($xml->children() as $node) { traverse_xml($node, $pad.' '); } echo $pad."</$name>\n"; } $people = simplexml_load_string($xml); traverse_xml($people); ?> ===DONE=== --EXPECTF-- <people> <person>Jane </person> </people> ===DONE=== http://cvs.php.net/viewcvs.cgi/php-src/ext/simplexml/tests/027.phpt?view=markup&rev=1.1 Index: php-src/ext/simplexml/tests/027.phpt +++ php-src/ext/simplexml/tests/027.phpt --TEST-- SimpleXML: Adding an elements --SKIPIF-- <?php if (!extension_loaded("simplexml")) print "skip"; ?> --FILE-- <?php $xml =<<<EOF <people></people> EOF; function traverse_xml($xml, $pad = '') { $name = $xml->getName(); echo "$pad<$name"; foreach($xml->attributes() as $attr => $value) { echo " $attr=\"$value\""; } echo ">" . trim($xml) . "\n"; foreach($xml->children() as $node) { traverse_xml($node, $pad.' '); } echo $pad."</$name>\n"; } $people = simplexml_load_string($xml); traverse_xml($people); $people->person = 'Joe'; $people->person['gender'] = 'male'; traverse_xml($people); $people->person = 'Jane'; traverse_xml($people); $people->person['gender'] = 'female'; $people->person[1] = 'Joe'; $people->person[1]['gender'] = 'male'; traverse_xml($people); $people->person[3] = 'Minni-me'; $people->person[2]['gender'] = 'male'; traverse_xml($people); $people->person[3]['gender'] = 'error'; ?> ===DONE=== --EXPECTF-- <people> </people> <people> <person gender="male">Joe </person> </people> <people> <person gender="male">Jane </person> </people> <people> <person gender="female">Jane </person> <person gender="male">Joe </person> </people> Warning: main(): Cannot add element person number 3 when only 2 such elements exist in %sext/simplexml/tests/027.php on line %d <people> <person gender="female">Jane </person> <person gender="male">Joe </person> <person gender="male">Minni-me </person> </people> Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in %sext/simplexml/tests/027.php on line %d -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php