rrichards               Tue Jan 13 16:28:42 2004 EDT

  Modified files:              
    /php-src/ext/simplexml      simplexml.c 
    /php-src/ext/simplexml/tests        017.phpt 
  Log:
  add support for $foo["a:bar"]
  fix xsearch to only return values for text,element and attribute nodes
  fix getChildren and return array
  remove most methods
  update test
  
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.103 php-src/ext/simplexml/simplexml.c:1.104
--- php-src/ext/simplexml/simplexml.c:1.103     Sat Jan 10 08:25:31 2004
+++ php-src/ext/simplexml/simplexml.c   Tue Jan 13 16:28:40 2004
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: simplexml.c,v 1.103 2004/01/10 13:25:31 helly Exp $ */
+/* $Id: simplexml.c,v 1.104 2004/01/13 21:28:40 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -158,9 +158,14 @@
 
        if (node) {
                if (attribs) {
+                       xmlChar *localname, *prefix=NULL;
+                       localname = xmlSplitQName2(name, &prefix);
+                       if (localname == NULL) {
+                               localname = (xmlChar *)name;
+                       }
                        attr = node->properties;
                        while (attr) {
-                               if (!xmlStrcmp(attr->name, name)) {
+                               if (!xmlStrcmp(attr->name, localname) && (prefix==NULL 
|| (attr->ns && !xmlStrcmp(attr->ns->prefix, prefix)))) {
                                        APPEND_PREV_ELEMENT(counter, value);
                                        
                                        MAKE_STD_ZVAL(value);
@@ -173,6 +178,12 @@
                                }
                                attr = attr->next;
                        }
+                       if (prefix) {
+                               xmlFree(prefix);
+                               if (localname) {
+                                       xmlFree(localname);
+                               }
+                       }
                }
 
                if (elements) {
@@ -319,9 +330,14 @@
 
        if (node) {
                if (attribs) {
+                       xmlChar *localname, *prefix=NULL;
+                       localname = xmlSplitQName2(name, &prefix);
+                       if (localname == NULL) {
+                               localname = (xmlChar *)name;
+                       }
                        attr = node->properties;
                        while (attr) {
-                               if (!xmlStrcmp(attr->name, name)) {
+                               if (!xmlStrcmp(attr->name, localname) && (prefix==NULL 
|| (attr->ns && !xmlStrcmp(attr->ns->prefix, prefix)))) {
                                        is_attr = 1;
                                        ++counter;
                                        break;
@@ -329,6 +345,12 @@
        
                                attr = attr->next;
                        }
+                       if (prefix) {
+                               xmlFree(prefix);
+                               if (localname) {
+                                       xmlFree(localname);
+                               }
+                       }
                }
 
                if (elements) {
@@ -402,6 +424,7 @@
        char           *name;
        xmlNodePtr      node;
        xmlAttrPtr      attr = NULL;
+       int                             exists = 0;
        
        sxe = php_sxe_fetch_object(object TSRMLS_CC);
        name = Z_STRVAL_P(member);
@@ -410,14 +433,26 @@
 
        if (node) {
                if (attribs) {
+                       xmlChar *localname, *prefix=NULL;
+                       localname = xmlSplitQName2(name, &prefix);
+                       if (localname == NULL) {
+                               localname = (xmlChar *)name;
+                       }
                        attr = node->properties;
                        while (attr) {
-                               if (!xmlStrcmp(attr->name, name)) {
-                                       return 1;
+                               if (!xmlStrcmp(attr->name, localname) && (prefix==NULL 
|| (attr->ns && !xmlStrcmp(attr->ns->prefix, prefix)))) {
+                                       exists = 1;
+                                       break;
                                }
        
                                attr = attr->next;
                        }
+                       if (prefix) {
+                               xmlFree(prefix);
+                               if (localname) {
+                                       xmlFree(localname);
+                               }
+                       }
                }
 
                if (elements) {
@@ -435,7 +470,7 @@
                }
        }
 
-       return 0;
+       return exists;
 }
 /* }}} */
 
@@ -479,15 +514,27 @@
 
        if (node) {
                if (attribs) {
+
+                       xmlChar *localname, *prefix=NULL;
+                       localname = xmlSplitQName2(Z_STRVAL_P(member), &prefix);
+                       if (localname == NULL) {
+                               localname = (xmlChar *)Z_STRVAL_P(member);
+                       }
                        attr = node->properties;
                        while (attr) {
                                anext = attr->next;
-                               if (!xmlStrcmp(attr->name, Z_STRVAL_P(member))) {
+                               if (!xmlStrcmp(attr->name, localname) && (prefix==NULL 
|| (attr->ns && !xmlStrcmp(attr->ns->prefix, prefix)))) {
                                        xmlUnlinkNode((xmlNodePtr) attr);
                                        php_libxml_node_free_resource((xmlNodePtr) 
attr TSRMLS_CC);
                                }
                                attr = anext;
                        }
+                       if (prefix) {
+                               xmlFree(prefix);
+                               if (localname) {
+                                       xmlFree(localname);
+                               }
+                       }
                }
 
                if (elements) {
@@ -687,6 +734,7 @@
        xmlNsPtr          *ns = NULL;
        xmlXPathObjectPtr  retval;
        xmlNodeSetPtr      result;
+       xmlNodePtr                 nodeptr;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &query, &query_len) 
== FAILURE) {
                return;
@@ -740,18 +788,22 @@
        array_init(return_value);
 
        for (i = 0; i < result->nodeNr; ++i) {
-               MAKE_STD_ZVAL(value);
-               /**
-                * Detect the case where the last selector is text(), simplexml
-                * always accesses the text() child by default, therefore we assign
-                * to the parent node.
-                */
-               if (result->nodeTab[i]->type == XML_TEXT_NODE) {
-                       _node_as_zval(sxe, result->nodeTab[i]->parent, value 
TSRMLS_CC);
-               } else {
-                       _node_as_zval(sxe, result->nodeTab[i], value TSRMLS_CC);
+               nodeptr = result->nodeTab[i];
+               if (nodeptr->type == XML_TEXT_NODE || nodeptr->type == 
XML_ELEMENT_NODE || nodeptr->type == XML_ATTRIBUTE_NODE) {
+                       MAKE_STD_ZVAL(value);
+                       /**
+                        * Detect the case where the last selector is text(), simplexml
+                        * always accesses the text() child by default, therefore we 
assign
+                        * to the parent node.
+                        */
+                       if (nodeptr->type == XML_TEXT_NODE) {
+                               _node_as_zval(sxe, nodeptr->parent, value TSRMLS_CC);
+                       } else  {
+                               _node_as_zval(sxe, nodeptr, value TSRMLS_CC);
+                       }
+
+                       add_next_index_zval(return_value, value);
                }
-               add_next_index_zval(return_value, value);
        }
        
        xmlXPathFreeObject(retval);
@@ -912,31 +964,6 @@
 }
 /* }}} */
 
-/* {{{ simplexml_count()
- */
-SXE_METHOD(count)
-{
-       char       *name;
-       int         name_len;
-       HashTable  *subnodes;
-       zval      **data_ptr;
-
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == 
FAILURE) {
-               return;
-       }
-       subnodes = sxe_properties_get(getThis() TSRMLS_CC);
-       if (zend_hash_find(subnodes, name, name_len+1, (void **) &data_ptr) == 
SUCCESS) {
-               if (Z_TYPE_PP(data_ptr) == IS_ARRAY) {
-                 RETURN_LONG(zend_hash_num_elements(Z_ARRVAL_PP(data_ptr)));
-               } else {
-                       RETURN_LONG(1);
-               }
-       } else {
-               RETURN_LONG(0);
-       }
-}
-/* }}} */
-
 /* {{{ simplexml_attributes()
  */
 SXE_METHOD(attributes)
@@ -1307,14 +1334,6 @@
 
                SKIP_TEXT(node);
        
-               do if (node->ns) {
-                       if (node->parent->ns) {
-                               if (!xmlStrcmp(node->ns->href, 
node->parent->ns->href)) {
-                                       break;
-                               }
-                       }
-               } while (0);
-       
                if (!sxe->iter.node->name) {
                        goto next_iter;
                } else {
@@ -1393,103 +1412,35 @@
        php_sxe_iterator_current(iterator->sxe TSRMLS_CC);
 }
 
-/* {{{ rewind()
- */ 
-SXE_METHOD(rewind)
-{
-       php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
 
-       GET_NODE(sxe, sxe->iter.node);
-       if (sxe->iter.node) {
-               sxe->iter.node = sxe->iter.node->children;
-       }
-       php_sxe_iterator_current(sxe TSRMLS_CC);
-}
-/* }}} */
-
-/* {{{ hasMore()
- */ 
-SXE_METHOD(hasMore)
-{
-       php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
-
-       RETURN_BOOL(sxe->iter.node);
-}
-/* }}} */
-
-/* {{{ curent()
- */ 
-SXE_METHOD(current)
-{
-       php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
-
-       RETURN_ZVAL(sxe->iter.data, 1, 0);
-}
-/* }}} */
-
-/* {{{ key()
- */ 
-SXE_METHOD(key)
-{
-       php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
-
-       RETURN_STRINGL(sxe->iter.name, sxe->iter.namelen-1, 1);
-}
-/* }}} */
-
-/* {{{ next()
+/* {{{ getChildren()
  */ 
-SXE_METHOD(next)
+SXE_METHOD(getChildren)
 {
-       php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
+       php_sxe_object *sxe;
+       xmlNodePtr      node;
+       xmlNodePtr      child;
+       zval           *value = NULL;
 
-       if (sxe->iter.node) {
-               sxe->iter.node = sxe->iter.node->next;
+       if (ZEND_NUM_ARGS() != 0) {
+               RETURN_FALSE;
        }
-       php_sxe_iterator_current(sxe TSRMLS_CC);
-}
-/* }}} */
 
-/* {{{ hasChildren()
- */ 
-SXE_METHOD(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);
-       xmlNodePtr      node;
+       sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
+       GET_NODE(sxe, node);
 
-       GET_NODE(child, node);
+       array_init(return_value);
        if (node) {
-               node = node->children;
-       }
-       while (node) {
-               SKIP_TEXT(node);
-                               
-               do if (node->ns) {
-                       if (node->parent->ns) {
-                               if (!xmlStrcmp(node->ns->href, 
node->parent->ns->href)) {
-                                       break;
-                               }
+               child = node->children;
+               while (child) {
+                       if (node->type == XML_ELEMENT_NODE) {
+                               MAKE_STD_ZVAL(value);
+                               _node_as_zval(sxe, child, value TSRMLS_CC);
+                               add_next_index_zval(return_value, value);
                        }
-               } while (0);
-               if (node->type == XML_ELEMENT_NODE) {
-                       break;
+                       child = child->next;
                }
-next_iter:
-               node = node->next;
        }
-       RETURN_BOOL(node ? 1 : 0);
-}
-/* }}} */
-
-/* {{{ getChildren()
- */ 
-SXE_METHOD(getChildren)
-{
-       php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
-
-       return_value->type = IS_OBJECT;
-       return_value->value.obj = zend_objects_store_clone_obj(sxe->iter.data 
TSRMLS_CC);
 }
 /* }}} */
 
@@ -1582,14 +1533,7 @@
        SXE_ME(validate_schema_file,   NULL, ZEND_ACC_PUBLIC)
 #endif
        SXE_ME(xsearch,                NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(rewind,                 NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(hasMore,                NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(current,                NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(key,                    NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(next,                   NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(hasChildren,            NULL, ZEND_ACC_PUBLIC)
        SXE_ME(getChildren,            NULL, ZEND_ACC_PUBLIC)
-       SXE_ME(count,                  NULL, ZEND_ACC_PUBLIC)
        SXE_ME(attributes,             NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
@@ -1630,7 +1574,7 @@
 {
        php_info_print_table_start();
        php_info_print_table_header(2, "Simplexml support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.103 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.104 $");
        php_info_print_table_row(2, "Schema support", 
 #ifdef LIBXML_SCHEMAS_ENABLED
                "enabled");
Index: php-src/ext/simplexml/tests/017.phpt
diff -u php-src/ext/simplexml/tests/017.phpt:1.1 
php-src/ext/simplexml/tests/017.phpt:1.2
--- php-src/ext/simplexml/tests/017.phpt:1.1    Thu Dec 18 08:28:00 2003
+++ php-src/ext/simplexml/tests/017.phpt        Tue Jan 13 16:28:41 2004
@@ -35,10 +35,10 @@
 }
 
 function print_xml2($xml) {
-  $persons = $xml->count("person");
+  $persons = count($xml->person);
   for ($i=0;$i<$persons;$i++) {
     echo "person: ".$xml->person[$i]['name']."\n";
-    $children = $xml->person[$i]->count("child");
+       $children = count($xml->person[$i]->child);
     for ($j=0;$j<$children;$j++) {
       echo "  child: ".$xml->person[$i]->child[$j]['name']."\n";
     }

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to