cvs: php-src /ext/simplexml simplexml.c /ext/simplexml/tests 017.phpt 018.phpt

From: Date: Thu, 18 Dec 2003 13:28:01 +0000
Subject: cvs: php-src /ext/simplexml simplexml.c /ext/simplexml/tests 017.phpt 018.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-25289@lists.php.net to get a copy of this message
dmitry Thu Dec 18 08:28:01 2003 EDT Added files: /php-src/ext/simplexml/tests 017.phpt 018.phpt Modified files: /php-src/ext/simplexml simplexml.c Log: two new methods were added $node->count($subnode_name) - returns count of subnodes with specified name $node->attributes() - returns array of attributes Index: php-src/ext/simplexml/simplexml.c diff -u php-src/ext/simplexml/simplexml.c:1.96 php-src/ext/simplexml/simplexml.c:1.97 --- php-src/ext/simplexml/simplexml.c:1.96 Wed Dec 17 10:06:39 2003 +++ php-src/ext/simplexml/simplexml.c Thu Dec 18 08:27:59 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: simplexml.c,v 1.96 2003/12/17 15:06:39 dmitry Exp $ */ +/* $Id: simplexml.c,v 1.97 2003/12/18 13:27:59 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -930,6 +930,69 @@ } /* }}} */ +/* {{{ simplexml_count() + */ +SXE_METHOD(count) +{ + char *name; + int name_len; + HashTable *subnodes; + zval **data_ptr; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + return; + } + subnodes = sxe_properties_get(getThis() TSRMLS_CC); + if (zend_hash_find(subnodes, name, name_len+1, (void **) &data_ptr) == SUCCESS) { + if (Z_TYPE_PP(data_ptr) == IS_ARRAY) { + RETURN_LONG(zend_hash_num_elements(Z_ARRVAL_PP(data_ptr))); + } else { + RETURN_LONG(1); + } + } else { + RETURN_LONG(0); + } +} +/* }}} */ + +/* {{{ simplexml_attributes() + */ +SXE_METHOD(attributes) +{ + php_sxe_object *sxe; + xmlNodePtr node; + xmlAttrPtr attr; + zval *value = NULL; + char *contents; + + if (ZEND_NUM_ARGS() != 0) { + RETURN_FALSE; + } + + sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + GET_NODE(sxe, node); + + array_init(return_value); + if (node) { + attr = node->properties; + while (attr) { + if (attr->name) { + MAKE_STD_ZVAL(value); + contents = xmlNodeListGetString((xmlDocPtr) sxe->document->ptr, attr->children, 1); + ZVAL_STRING(value, contents, 1); + if (contents) { + xmlFree(contents); + } + add_assoc_zval_ex(return_value, + (char*)attr->name, + xmlStrlen(attr->name) + 1, value); + } + attr = attr->next; + } + } +} +/* }}} */ + /* {{{ cast_object() */ static int @@ -1536,6 +1599,8 @@ SXE_ME(next, NULL, ZEND_ACC_PUBLIC) SXE_ME(hasChildren, NULL, ZEND_ACC_PUBLIC) SXE_ME(getChildren, NULL, ZEND_ACC_PUBLIC) + SXE_ME(count, NULL, ZEND_ACC_PUBLIC) + SXE_ME(attributes, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -1590,7 +1655,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "Simplexml support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.96 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.97 $"); php_info_print_table_row(2, "Schema support", #ifdef LIBXML_SCHEMAS_ENABLED "enabled"); Index: php-src/ext/simplexml/tests/017.phpt +++ php-src/ext/simplexml/tests/017.phpt --TEST-- SimpleXML: iteration through subnodes --SKIPIF-- <?php if (!extension_loaded("simplexml")) print "skip"; ?> --FILE-- <?php $xml =<<<EOF <people> <person name="Joe"> <child name="Ann" /> <child name="Marray" /> </person> <person name="Boe"> <child name="Joe" /> <child name="Ann" /> </person> </people> EOF; $xml1 =<<<EOF <people> <person name="Joe"> <child name="Ann" /> </person> </people> EOF; function print_xml($xml) { foreach($xml as $person) { echo "person: ".$person['name']."\n"; foreach($person as $child) { echo " child: ".$child['name']."\n"; } } echo "----------\n"; } function print_xml2($xml) { $persons = $xml->count("person"); for ($i=0;$i<$persons;$i++) { echo "person: ".$xml->person[$i]['name']."\n"; $children = $xml->person[$i]->count("child"); for ($j=0;$j<$children;$j++) { echo " child: ".$xml->person[$i]->child[$j]['name']."\n"; } } echo "----------\n"; } print_xml(simplexml_load_string($xml)); print_xml(simplexml_load_string($xml1)); print_xml2(simplexml_load_string($xml)); print_xml2(simplexml_load_string($xml1)); echo "---Done---\n"; ?> --EXPECT-- person: Joe child: Ann child: Marray person: Boe child: Joe child: Ann ---------- person: Joe child: Ann ---------- person: Joe child: Ann child: Marray person: Boe child: Joe child: Ann ---------- person: Joe child: Ann ---------- ---Done--- Index: php-src/ext/simplexml/tests/018.phpt +++ php-src/ext/simplexml/tests/018.phpt --TEST-- SimpleXML: iteration through subnodes and attributes --SKIPIF-- <?php if (!extension_loaded("simplexml")) print "skip"; ?> --FILE-- <?php $xml =<<<EOF <people> <person name="Joe"> Text1 <child name="Ann" /> Text2 <child name="Marray" /> Text3 </person> <person name="Boe"> <child name="Joe" /> <child name="Ann" /> </person> </people> EOF; $xml1 =<<<EOF <people> <person name="Joe"> <child /> </person> </people> EOF; function traverse_xml($pad,$xml) { foreach($xml as $name => $node) { echo $pad."<$name"; foreach($node->attributes() as $attr => $value) { echo " $attr=\"$value\""; } echo ">\n"; traverse_xml($pad." ",$node); echo $pad."</$name>\n"; } } traverse_xml("",simplexml_load_string($xml)); echo "----------\n"; traverse_xml("",simplexml_load_string($xml1)); echo "---Done---\n"; ?> --EXPECT-- <person name="Joe"> <child name="Ann"> </child> <child name="Marray"> </child> </person> <person name="Boe"> <child name="Joe"> </child> <child name="Ann"> </child> </person> ---------- <person name="Joe"> <child> </child> </person> ---Done---

« previous php.cvs (#25289) next »