helly Wed Oct 29 07:06:53 2003 EDT
Modified files:
/php-src/ext/simplexml simplexml.c
/php-src/ext/simplexml/tests 007.phpt
Log:
Add simplexml array handlers that allow to explicitly work with attributes.
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.75 php-src/ext/simplexml/simplexml.c:1.76
--- php-src/ext/simplexml/simplexml.c:1.75 Sun Oct 26 20:12:53 2003
+++ php-src/ext/simplexml/simplexml.c Wed Oct 29 07:06:51 2003
@@ -13,10 +13,11 @@
| [EMAIL PROTECTED] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Sterling Hughes <[EMAIL PROTECTED]> |
+ | Marcus Boerger <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: simplexml.c,v 1.75 2003/10/27 01:12:53 rrichards Exp $ */
+/* $Id: simplexml.c,v 1.76 2003/10/29 12:06:51 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -115,10 +116,10 @@
}
/* }}} */
-/* {{{ sxe_property_read()
+/* {{{ sxe_prop_dim_read()
*/
static zval *
-sxe_property_read(zval *object, zval *member, zend_bool silent TSRMLS_DC)
+sxe_prop_dim_read(zval *object, zval *member, zend_bool elements, zend_bool attribs,
zend_bool silent TSRMLS_DC)
{
zval *return_value;
zval *value = NULL;
@@ -139,54 +140,58 @@
GET_NODE(sxe, node);
if (node) {
- attr = node->properties;
- while (attr) {
- if (!xmlStrcmp(attr->name, name)) {
- APPEND_PREV_ELEMENT(counter, value);
-
- MAKE_STD_ZVAL(value);
- contents = xmlNodeListGetString((xmlDocPtr)
sxe->document->ptr, attr->children, 1);
- ZVAL_STRING(value, contents, 1);
- if (contents) {
- xmlFree(contents);
+ if (attribs) {
+ attr = node->properties;
+ while (attr) {
+ if (!xmlStrcmp(attr->name, name)) {
+ APPEND_PREV_ELEMENT(counter, value);
+
+ MAKE_STD_ZVAL(value);
+ contents = xmlNodeListGetString((xmlDocPtr)
sxe->document->ptr, attr->children, 1);
+ ZVAL_STRING(value, contents, 1);
+ if (contents) {
+ xmlFree(contents);
+ }
+ APPEND_CUR_ELEMENT(counter, value);
}
- APPEND_CUR_ELEMENT(counter, value);
+ attr = attr->next;
}
- attr = attr->next;
}
- if (!sxe->node) {
- php_libxml_increment_node_ptr((php_libxml_node_object *)sxe,
node, NULL TSRMLS_CC);
- }
- 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;
- }
- }
+ if (elements) {
+ if (!sxe->node) {
+ php_libxml_increment_node_ptr((php_libxml_node_object
*)sxe, node, NULL TSRMLS_CC);
+ }
+ node = node->children;
+
+ while (node) {
+ SKIP_TEXT(node);
- if (match_ns(sxe, node, name)) {
+ do if (node->ns) {
+ if (node->parent->ns) {
+ if (!xmlStrcmp(node->ns->href,
node->parent->ns->href)) {
+ break;
+ }
+ }
+
+ if (match_ns(sxe, node, name)) {
+ MAKE_STD_ZVAL(value);
+ _node_as_zval(sxe, node->parent, value
TSRMLS_CC);
+ APPEND_CUR_ELEMENT(counter, value);
+ goto next_iter;
+ }
+ } while (0);
+
+ if (!xmlStrcmp(node->name, name)) {
+ APPEND_PREV_ELEMENT(counter, value);
MAKE_STD_ZVAL(value);
- _node_as_zval(sxe, node->parent, value
TSRMLS_CC);
+ _node_as_zval(sxe, node, value TSRMLS_CC);
APPEND_CUR_ELEMENT(counter, value);
- goto next_iter;
}
- } while (0);
-
- if (!xmlStrcmp(node->name, name)) {
- APPEND_PREV_ELEMENT(counter, value);
- MAKE_STD_ZVAL(value);
- _node_as_zval(sxe, node, value TSRMLS_CC);
- APPEND_CUR_ELEMENT(counter, value);
- }
-
+
next_iter:
- node = node->next;
+ node = node->next;
+ }
}
/* Only one value found */
@@ -205,6 +210,24 @@
}
/* }}} */
+/* {{{ sxe_property_read()
+ */
+static zval *
+sxe_property_read(zval *object, zval *member, zend_bool silent TSRMLS_DC)
+{
+ return sxe_prop_dim_read(object, member, 1, 1, silent TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ sxe_dimension_read()
+ */
+static zval *sxe_dimension_read(zval *object, zval *offset TSRMLS_DC)
+{
+ convert_to_string_ex(&offset);
+ return sxe_prop_dim_read(object, offset, 0, 1, 0 TSRMLS_CC);
+}
+/* }}} */
+
/* {{{ change_node_zval()
*/
static void
@@ -228,15 +251,14 @@
/* {{{ sxe_property_write()
*/
-static void
-sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
+static void sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool
elements, zend_bool attribs TSRMLS_DC)
{
php_sxe_object *sxe;
char *name;
xmlNodePtr node;
xmlNodePtr newnode = NULL;
xmlNodePtr tempnode;
- xmlAttrPtr attr;
+ xmlAttrPtr attr = NULL;
int counter = 0;
int is_attr = 0;
@@ -246,27 +268,31 @@
GET_NODE(sxe, node);
if (node) {
- attr = node->properties;
- while (attr) {
- if (!xmlStrcmp(attr->name, name)) {
- is_attr = 1;
- ++counter;
- break;
+ if (attribs) {
+ attr = node->properties;
+ while (attr) {
+ if (!xmlStrcmp(attr->name, name)) {
+ is_attr = 1;
+ ++counter;
+ break;
+ }
+
+ attr = attr->next;
}
-
- attr = attr->next;
}
- node = node->children;
- while (node) {
- SKIP_TEXT(node);
- if (!xmlStrcmp(node->name, name)) {
- newnode = node;
- ++counter;
- }
-
+ if (elements) {
+ node = node->children;
+ while (node) {
+ SKIP_TEXT(node);
+ if (!xmlStrcmp(node->name, name)) {
+ newnode = node;
+ ++counter;
+ }
+
next_iter:
- node = node->next;
+ node = node->next;
+ }
}
if (counter == 1) {
@@ -280,11 +306,30 @@
change_node_zval(newnode, value);
} else if (counter > 1) {
php_error(E_WARNING, "Cannot assign to an array of nodes
(duplicate subnodes or attr detected)\n");
+ } else {
+ php_error(E_WARNING, "Cannot create new atrribute\n");
}
}
}
/* }}} */
+/* {{{ sxe_property_write()
+ */
+static void sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
+{
+ sxe_prop_dim_write(object, member, value, 1, 1 TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ sxe_dimension_write()
+ */
+static void sxe_dimension_write(zval *object, zval *offset, zval *value TSRMLS_DC)
+{
+ convert_to_string_ex(&offset);
+ sxe_prop_dim_write(object, offset, value, 0, 1 TSRMLS_CC);
+}
+/* }}} */
+
/* {{{ sxe_property_exists()
*/
static int
@@ -327,10 +372,9 @@
}
/* }}} */
-/* {{{ sxe_property_delete()
+/* {{{ sxe_prop_dim_delete()
*/
-static void
-sxe_property_delete(zval *object, zval *member TSRMLS_DC)
+static void sxe_prop_dim_delete(zval *object, zval *member, zend_bool elements,
zend_bool attribs TSRMLS_DC)
{
php_sxe_object *sxe;
xmlNodePtr node;
@@ -343,34 +387,56 @@
GET_NODE(sxe, node);
if (node) {
- attr = node->properties;
- while (attr) {
- anext = attr->next;
- if (!xmlStrcmp(attr->name, Z_STRVAL_P(member))) {
- xmlUnlinkNode((xmlNodePtr) attr);
- xmlFreeProp(attr);
+ if (attribs) {
+ attr = node->properties;
+ while (attr) {
+ anext = attr->next;
+ if (!xmlStrcmp(attr->name, Z_STRVAL_P(member))) {
+ xmlUnlinkNode((xmlNodePtr) attr);
+ xmlFreeProp(attr);
+ }
+ attr = anext;
}
- attr = anext;
}
-
- node = node->children;
- while (node) {
- nnext = node->next;
- SKIP_TEXT(node);
-
- if (!xmlStrcmp(node->name, Z_STRVAL_P(member))) {
- xmlUnlinkNode(node);
- xmlFreeNode(node);
- }
+ if (elements) {
+ node = node->children;
+ while (node) {
+ nnext = node->next;
+
+ SKIP_TEXT(node);
+
+ if (!xmlStrcmp(node->name, Z_STRVAL_P(member))) {
+ xmlUnlinkNode(node);
+ xmlFreeNode(node);
+ }
next_iter:
- node = nnext;
+ node = nnext;
+ }
}
}
}
/* }}} */
+/* {{{ sxe_property_delete()
+ */
+static void
+sxe_property_delete(zval *object, zval *member TSRMLS_DC)
+{
+ sxe_prop_dim_delete(object, member, 1, 1 TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ sxe_dimension_unset()
+ */
+static void sxe_dimension_delete(zval *object, zval *offset TSRMLS_DC)
+{
+ convert_to_string_ex(&offset);
+ sxe_prop_dim_delete(object, offset, 1, 1 TSRMLS_CC);
+}
+/* }}} */
+
/* {{{ _get_base_node_value()
*/
static void
@@ -867,14 +933,14 @@
ZEND_OBJECTS_STORE_HANDLERS,
sxe_property_read,
sxe_property_write,
- NULL,
- NULL,
+ sxe_dimension_read,
+ sxe_dimension_write,
NULL,
sxe_object_get,
sxe_object_set,
sxe_property_exists,
sxe_property_delete,
- NULL,
+ sxe_dimension_delete,
sxe_properties_get,
sxe_method_get,
sxe_call_method,
@@ -1096,13 +1162,12 @@
_get_base_node_value(iterator->sxe, iterator->node, &iterator->data
TSRMLS_CC);
- iterator->node->name = (char *) iterator->node->name;
if (!iterator->node->name) {
iterator->name = "CDATA";
iterator->namelen = sizeof("CDATA");
} else {
iterator->namelen = xmlStrlen(iterator->node->name)+1;
- iterator->name = iterator->node->name;
+ iterator->name = (char *) iterator->node->name;
}
break;
next_iter:
@@ -1295,7 +1360,7 @@
{
php_info_print_table_start();
php_info_print_table_header(2, "Simplexml support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.75 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.76 $");
php_info_print_table_row(2, "Schema support",
#ifdef LIBXML_SCHEMAS_ENABLED
"enabled");
Index: php-src/ext/simplexml/tests/007.phpt
diff -u php-src/ext/simplexml/tests/007.phpt:1.1
php-src/ext/simplexml/tests/007.phpt:1.2
--- php-src/ext/simplexml/tests/007.phpt:1.1 Sun Oct 26 08:27:26 2003
+++ php-src/ext/simplexml/tests/007.phpt Wed Oct 29 07:06:52 2003
@@ -7,13 +7,36 @@
$sxe = simplexml_load_file(dirname(__FILE__).'/sxe.xml');
+echo "===Property===\n";
var_dump($sxe->id);
var_dump($sxe->elem1->attr1);
-
-echo "===Done===\n";
+echo "===Array===\n";
+var_dump($sxe['id']);
+var_dump($sxe->elem1['attr1']);
+echo "===Set===\n";
+$sxe['id'] = "Changed1";
+var_dump($sxe['id']);
+$sxe->elem1['attr1'] = 12;
+var_dump($sxe->elem1['attr1']);
+echo "===Unset===\n";
+unset($sxe['id']);
+var_dump($sxe['id']);
+unset($sxe->elem1['attr1']);
+var_dump($sxe->elem1['attr1']);
?>
+===Done===
--EXPECT--
+===Property===
+string(5) "elem1"
+string(5) "first"
+===Array===
string(5) "elem1"
string(5) "first"
+===Set===
+string(8) "Changed1"
+string(2) "12"
+===Unset===
+NULL
+NULL
===Done===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php