}
/* }}} */
+/* {{{ 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)
+{
+ php_sxe_object *sxe;
+ xmlNodePtr node;
+ xmlAttrPtr attr;
+ zval *value = NULL;
+ char *contents;
+
+ if (ZEND_NUM_ARGS() != 0) {
+ RETURN_FALSE;
+ }
+
+ sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
+ GET_NODE(sxe, node);
+
+ array_init(return_value);
+ if (node) {
+ attr = node->properties;
+ while (attr) {
+ if (attr->name) {
+ MAKE_STD_ZVAL(value);
+ contents = xmlNodeListGetString((xmlDocPtr) sxe->document->ptr, attr->children, 1);
+ ZVAL_STRING(value, contents, 1);
+ if (contents) {
+ xmlFree(contents);
+ }
+ add_assoc_zval_ex(return_value,
+ (char*)attr->name,
+ xmlStrlen(attr->name) + 1, value);
+ }
+ attr = attr->next;
+ }
+ }
+}
+/* }}} */
+
/* {{{ cast_object()
*/
static int
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}
};
--- /dev/null
+--TEST--
+SimpleXML: iteration through subnodes
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip"; ?>
+--FILE--
+<?php
+$xml =<<<EOF
+<people>
+ <person name="Joe">
+ <child name="Ann" />
+ <child name="Marray" />
+ </person>
+ <person name="Boe">
+ <child name="Joe" />
+ <child name="Ann" />
+ </person>
+</people>
+EOF;
+$xml1 =<<<EOF
+<people>
+ <person name="Joe">
+ <child name="Ann" />
+ </person>
+</people>
+EOF;
+
+function print_xml($xml) {
+ foreach($xml as $person) {
+ echo "person: ".$person['name']."\n";
+ foreach($person as $child) {
+ echo " child: ".$child['name']."\n";
+ }
+ }
+ echo "----------\n";
+}
+
+function print_xml2($xml) {
+ $persons = $xml->count("person");
+ for ($i=0;$i<$persons;$i++) {
+ echo "person: ".$xml->person[$i]['name']."\n";
+ $children = $xml->person[$i]->count("child");
+ for ($j=0;$j<$children;$j++) {
+ echo " child: ".$xml->person[$i]->child[$j]['name']."\n";
+ }
+ }
+ echo "----------\n";
+}
+
+print_xml(simplexml_load_string($xml));
+print_xml(simplexml_load_string($xml1));
+print_xml2(simplexml_load_string($xml));
+print_xml2(simplexml_load_string($xml1));
+echo "---Done---\n";
+?>
+--EXPECT--
+person: Joe
+ child: Ann
+ child: Marray
+person: Boe
+ child: Joe
+ child: Ann
+----------
+person: Joe
+ child: Ann
+----------
+person: Joe
+ child: Ann
+ child: Marray
+person: Boe
+ child: Joe
+ child: Ann
+----------
+person: Joe
+ child: Ann
+----------
+---Done---
--- /dev/null
+--TEST--
+SimpleXML: iteration through subnodes and attributes
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip"; ?>
+--FILE--
+<?php
+$xml =<<<EOF
+<people>
+ <person name="Joe">
+ Text1
+ <child name="Ann" />
+ Text2
+ <child name="Marray" />
+ Text3
+ </person>
+ <person name="Boe">
+ <child name="Joe" />
+ <child name="Ann" />
+ </person>
+</people>
+EOF;
+$xml1 =<<<EOF
+<people>
+ <person name="Joe">
+ <child />
+ </person>
+</people>
+EOF;
+
+function traverse_xml($pad,$xml) {
+ foreach($xml as $name => $node) {
+ echo $pad."<$name";
+ foreach($node->attributes() as $attr => $value) {
+ echo " $attr=\"$value\"";
+ }
+ echo ">\n";
+ traverse_xml($pad." ",$node);
+ echo $pad."</$name>\n";
+ }
+}
+
+traverse_xml("",simplexml_load_string($xml));
+echo "----------\n";
+traverse_xml("",simplexml_load_string($xml1));
+echo "---Done---\n";
+?>
+--EXPECT--
+<person name="Joe">
+ <child name="Ann">
+ </child>
+ <child name="Marray">
+ </child>
+</person>
+<person name="Boe">
+ <child name="Joe">
+ </child>
+ <child name="Ann">
+ </child>
+</person>
+----------
+<person name="Joe">
+ <child>
+ </child>
+</person>
+---Done---
\ No newline at end of file