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);
|
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);
|
RETURN_ZVAL(sxe->iter.data, 1, 0);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -64,11 +68,16 @@ SPL_METHOD(SimpleXMLIterator, current) /* {{{ */
|
||||||
SPL_METHOD(SimpleXMLIterator, key) /* {{{ */
|
SPL_METHOD(SimpleXMLIterator, key) /* {{{ */
|
||||||
{
|
{
|
||||||
xmlNodePtr curnode;
|
xmlNodePtr curnode;
|
||||||
|
php_sxe_object *intern;
|
||||||
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
|
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
|
||||||
|
|
||||||
if (sxe->node != NULL) {
|
if (!sxe->iter.data) {
|
||||||
curnode = (xmlNodePtr)((php_libxml_node_ptr *)sxe->node)->node;
|
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);
|
RETURN_STRINGL((char*)curnode->name, xmlStrlen(curnode->name), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,9 +98,14 @@ SPL_METHOD(SimpleXMLIterator, next) /* {{{ */
|
||||||
SPL_METHOD(SimpleXMLIterator, hasChildren)
|
SPL_METHOD(SimpleXMLIterator, hasChildren)
|
||||||
{
|
{
|
||||||
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
|
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;
|
xmlNodePtr node;
|
||||||
|
|
||||||
|
if (!sxe->iter.data) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC);
|
||||||
|
|
||||||
GET_NODE(child, node);
|
GET_NODE(child, node);
|
||||||
if (node) {
|
if (node) {
|
||||||
node = node->children;
|
node = node->children;
|
||||||
|
@ -109,6 +123,9 @@ SPL_METHOD(SimpleXMLIterator, getChildren)
|
||||||
{
|
{
|
||||||
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
|
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->type = IS_OBJECT;
|
||||||
return_value->value.obj = zend_objects_store_clone_obj(sxe->iter.data TSRMLS_CC);
|
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