]> granicus.if.org Git - php/commitdiff
Fix classname, CDATA handling (semantically identical to text) and
authorMarcus Boerger <helly@php.net>
Thu, 13 Nov 2003 20:32:38 +0000 (20:32 +0000)
committerMarcus Boerger <helly@php.net>
Thu, 13 Nov 2003 20:32:38 +0000 (20:32 +0000)
iterators (Return sub elements as objects, converted to string you get
the text).

ext/simplexml/simplexml.c
ext/simplexml/tests/004.phpt
ext/simplexml/tests/009.phpt [new file with mode: 0755]
ext/simplexml/tests/009.xml [new file with mode: 0755]

index b6ca21b51bced7a0503c7a2bed3443e208dc62e3..ca18e0b40af0c5ef43fdbf55f469da7fd72f59e6 100644 (file)
@@ -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:
index 30759118a3b6e1253013e07a5116402f4a66ffd8..7f01ec1490077b42e927f482519a994cd8fb5c54 100755 (executable)
@@ -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 (executable)
index 0000000..c7bbe02
--- /dev/null
@@ -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 (executable)
index 0000000..d8d93de
--- /dev/null
@@ -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