mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
Fix problems with manual iteration
This commit is contained in:
parent
348abec29d
commit
94e64e3d8b
2 changed files with 98 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
|
|
77
ext/spl/tests/sxe_003.phpt
Executable file
77
ext/spl/tests/sxe_003.phpt
Executable file
|
@ -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===
|
Loading…
Add table
Add a link
Reference in a new issue