summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-11-13 20:32:38 +0000
committerMarcus Boerger <helly@php.net>2003-11-13 20:32:38 +0000
commit2b35596d7f3762b805a24df481a65ed3cc5de319 (patch)
treeb16f1bfd808bd4415cef7b9100889a11f733181f
parent2bed6c2b8a3e9f2a005257489cf17abf055709a7 (diff)
downloadphp-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.c34
-rwxr-xr-xext/simplexml/tests/004.phpt12
-rwxr-xr-xext/simplexml/tests/009.phpt22
-rwxr-xr-xext/simplexml/tests/009.xml24
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