diff options
author | Marcus Boerger <helly@php.net> | 2004-01-18 16:25:26 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2004-01-18 16:25:26 +0000 |
commit | 94e64e3d8bb6ed5e39b7c73311b8123edf122ab8 (patch) | |
tree | c16a24f90dc86ddbd6519d9189eacc47bf632dc4 | |
parent | 348abec29dc2740bf5df95eae0f3fedc6344c467 (diff) | |
download | php-git-94e64e3d8bb6ed5e39b7c73311b8123edf122ab8.tar.gz |
Fix problems with manual iteration
-rwxr-xr-x | ext/spl/spl_sxe.c | 25 | ||||
-rwxr-xr-x | ext/spl/tests/sxe_003.phpt | 77 |
2 files changed, 98 insertions, 4 deletions
diff --git a/ext/spl/spl_sxe.c b/ext/spl/spl_sxe.c index 0e22f80617..6d856cc876 100755 --- a/ext/spl/spl_sxe.c +++ b/ext/spl/spl_sxe.c @@ -57,6 +57,10 @@ SPL_METHOD(SimpleXMLIterator, current) /* {{{ */ { php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + if (!sxe->iter.data) { + return; /* return NULL */ + } + RETURN_ZVAL(sxe->iter.data, 1, 0); } /* }}} */ @@ -64,11 +68,16 @@ SPL_METHOD(SimpleXMLIterator, current) /* {{{ */ SPL_METHOD(SimpleXMLIterator, key) /* {{{ */ { xmlNodePtr curnode; - + php_sxe_object *intern; php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); - if (sxe->node != NULL) { - curnode = (xmlNodePtr)((php_libxml_node_ptr *)sxe->node)->node; + if (!sxe->iter.data) { + RETURN_FALSE; + } + + intern = (php_sxe_object *)zend_object_store_get_object(sxe->iter.data TSRMLS_CC); + if (intern != NULL && intern->node != NULL) { + curnode = (xmlNodePtr)((php_libxml_node_ptr *)intern->node)->node; RETURN_STRINGL((char*)curnode->name, xmlStrlen(curnode->name), 1); } @@ -89,9 +98,14 @@ SPL_METHOD(SimpleXMLIterator, next) /* {{{ */ SPL_METHOD(SimpleXMLIterator, hasChildren) { php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); - php_sxe_object *child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC); + php_sxe_object *child; xmlNodePtr node; + if (!sxe->iter.data) { + RETURN_FALSE; + } + child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC); + GET_NODE(child, node); if (node) { node = node->children; @@ -109,6 +123,9 @@ SPL_METHOD(SimpleXMLIterator, getChildren) { php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + if (!sxe->iter.data) { + return; /* return NULL */ + } return_value->type = IS_OBJECT; return_value->value.obj = zend_objects_store_clone_obj(sxe->iter.data TSRMLS_CC); } diff --git a/ext/spl/tests/sxe_003.phpt b/ext/spl/tests/sxe_003.phpt new file mode 100755 index 0000000000..d247896887 --- /dev/null +++ b/ext/spl/tests/sxe_003.phpt @@ -0,0 +1,77 @@ +--TEST-- +SPL: SimpleXMLIterator and getChildren() +--SKIPIF-- +<?php + if (!extension_loaded('simplexml')) print 'skip'; + if (!class_exists('RecursiveIteratorIterator')) print 'skip RecursiveIteratorIterator not available'; +?> +--FILE-- +<?php + +$xml =<<<EOF +<?xml version='1.0'?> +<!DOCTYPE sxe SYSTEM "notfound.dtd"> +<sxe id="elem1"> + Plain text. + <elem1 attr1='first'> + Bla bla 1. + <!-- comment --> + <elem2> + Here we have some text data. + <elem3> + And here some more. + <elem4> + Wow once again. + </elem4> + </elem3> + </elem2> + </elem1> + <elem11 attr2='second'> + Bla bla 2. + <elem111> + Foo Bar + </elem111> + </elem11> +</sxe> +EOF; + +$sxe = simplexml_load_string($xml, 'SimpleXMLIterator'); + +foreach($sxe->getChildren() as $name => $data) { + var_dump($name); + var_dump(get_class($data)); + var_dump(trim($data)); +} + +echo "===RESET===\n"; + +for ($sxe->rewind(); $sxe->hasMore(); $sxe->next()) { + var_dump($sxe->hasChildren()); + var_dump(trim($sxe->key())); + var_dump(trim($sxe->current())); + foreach($sxe->getChildren() as $name => $data) { + var_dump($name); + var_dump(get_class($data)); + var_dump(trim($data)); + } +} + +?> +===DONE=== +--EXPECTF-- + +Warning: Invalid argument supplied for foreach() in %ssxe_003.php on line %d +===RESET=== +bool(true) +string(5) "elem1" +string(10) "Bla bla 1." +string(5) "elem2" +string(17) "SimpleXMLIterator" +string(28) "Here we have some text data." +bool(true) +string(6) "elem11" +string(10) "Bla bla 2." +string(7) "elem111" +string(17) "SimpleXMLIterator" +string(7) "Foo Bar" +===DONE=== |