diff options
| author | Marcus Boerger <helly@php.net> | 2003-11-13 20:32:38 +0000 |
|---|---|---|
| committer | Marcus Boerger <helly@php.net> | 2003-11-13 20:32:38 +0000 |
| commit | 2b35596d7f3762b805a24df481a65ed3cc5de319 (patch) | |
| tree | b16f1bfd808bd4415cef7b9100889a11f733181f | |
| parent | 2bed6c2b8a3e9f2a005257489cf17abf055709a7 (diff) | |
| download | php-git-2b35596d7f3762b805a24df481a65ed3cc5de319.tar.gz | |
Fix classname, CDATA handling (semantically identical to text) and
iterators (Return sub elements as objects, converted to string you get
the text).
| -rw-r--r-- | ext/simplexml/simplexml.c | 34 | ||||
| -rwxr-xr-x | ext/simplexml/tests/004.phpt | 12 | ||||
| -rwxr-xr-x | ext/simplexml/tests/009.phpt | 22 | ||||
| -rwxr-xr-x | ext/simplexml/tests/009.xml | 24 |
4 files changed, 72 insertions, 20 deletions
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index b6ca21b51b..ca18e0b40a 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -553,16 +553,15 @@ sxe_properties_get(zval *object TSRMLS_DC) while (node) { SKIP_TEXT(node); - _get_base_node_value(sxe, node, &value TSRMLS_CC); - name = (char *) node->name; if (!name) { - name = "CDATA"; - namelen = sizeof("CDATA"); + goto next_iter; } else { namelen = xmlStrlen(node->name) + 1; } + _get_base_node_value(sxe, node, &value TSRMLS_CC); + h = zend_hash_func(name, namelen); if (zend_hash_quick_find(rv, name, namelen, h, (void **) &data_ptr) == SUCCESS) { if (Z_TYPE_PP(data_ptr) == IS_ARRAY) { @@ -884,7 +883,7 @@ static int sxe_class_name_get(zval *object, char **class_name, zend_uint *class_name_len, int parent TSRMLS_DC) { *class_name = estrdup("simplexml_element"); - *class_name_len = sizeof("simplexml_element"); + *class_name_len = sizeof("simplexml_element")-1; return 0; } @@ -1216,17 +1215,28 @@ zend_object_iterator_funcs php_sxe_iterator_funcs = { static void php_sxe_iterator_current(php_sxe_iterator *iterator TSRMLS_DC) { + xmlNodePtr node; + while (iterator->node) { - SKIP_TEXT(iterator->node); + node = iterator->node; + + SKIP_TEXT(node); + + do if (node->ns) { + if (node->parent->ns) { + if (!xmlStrcmp(node->ns->href, node->parent->ns->href)) { + break; + } + } + } while (0); - _get_base_node_value(iterator->sxe, iterator->node, &iterator->data TSRMLS_CC); - if (!iterator->node->name) { - iterator->name = "CDATA"; - iterator->namelen = sizeof("CDATA"); + goto next_iter; } else { - iterator->namelen = xmlStrlen(iterator->node->name)+1; - iterator->name = (char *) iterator->node->name; + iterator->namelen = xmlStrlen(node->name)+1; + iterator->name = (char *) node->name; + MAKE_STD_ZVAL(iterator->data); + _node_as_zval(iterator->sxe, node, iterator->data TSRMLS_CC); } break; next_iter: diff --git a/ext/simplexml/tests/004.phpt b/ext/simplexml/tests/004.phpt index 30759118a3..7f01ec1490 100755 --- a/ext/simplexml/tests/004.phpt +++ b/ext/simplexml/tests/004.phpt @@ -11,11 +11,10 @@ print_r($sxe); $elem1 = $sxe->elem1; $elem2 = $elem1->elem2; -echo($elem2->CDATA); - -echo "---Done---\n"; +var_dump(trim((string)$elem2)); ?> +===DONE=== --EXPECT-- simplexml_element Object ( @@ -27,10 +26,6 @@ simplexml_element Object [elem2] => simplexml_element Object ( - [CDATA] => simplexml_element Object - ( - ) - [elem3] => simplexml_element Object ( [elem4] => simplexml_element Object @@ -48,4 +43,5 @@ simplexml_element Object ) ) ----Done--- +string(11) "CDATA block" +===DONE=== diff --git a/ext/simplexml/tests/009.phpt b/ext/simplexml/tests/009.phpt new file mode 100755 index 0000000000..c7bbe02245 --- /dev/null +++ b/ext/simplexml/tests/009.phpt @@ -0,0 +1,22 @@ +--TEST-- +SimpleXML and XPath +--SKIPIF-- +<?php if (!extension_loaded("simplexml")) print "skip"; ?> +--FILE-- +<?php +$sxe = simplexml_load_file(dirname(__FILE__).'/009.xml'); +foreach($sxe as $name=>$val) { + var_dump($name); + var_dump(get_class($val)); + var_dump(trim((string)$val)); +} +?> +===DONE=== +--EXPECT-- +string(5) "elem1" +string(17) "simplexml_element" +string(10) "Bla bla 1." +string(6) "elem11" +string(17) "simplexml_element" +string(10) "Bla bla 2." +===DONE=== diff --git a/ext/simplexml/tests/009.xml b/ext/simplexml/tests/009.xml new file mode 100755 index 0000000000..d8d93debde --- /dev/null +++ b/ext/simplexml/tests/009.xml @@ -0,0 +1,24 @@ +<?xml version='1.0'?> +<!DOCTYPE sxe SYSTEM "notfound.dtd" [ +<!ENTITY % incent SYSTEM "sxe.ent"> +%incent; +]> +<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. + </elem11> +</sxe>
\ No newline at end of file |
