Browse Source

two new methods were added

$node->count($subnode_name) - returns count of subnodes with specified name
  $node->attributes() - returns array of attributes
PEAR_1_4DEV
Dmitry Stogov 22 years ago
parent
commit
eb973da1d3
  1. 65
      ext/simplexml/simplexml.c
  2. 76
      ext/simplexml/tests/017.phpt
  3. 65
      ext/simplexml/tests/018.phpt

65
ext/simplexml/simplexml.c

@ -930,6 +930,69 @@ SXE_METHOD(to_xml_file)
}
/* }}} */
/* {{{ 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
@ -1536,6 +1599,8 @@ static zend_function_entry sxe_functions[] = {
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}
};

76
ext/simplexml/tests/017.phpt

@ -0,0 +1,76 @@
--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---

65
ext/simplexml/tests/018.phpt

@ -0,0 +1,65 @@
--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---
Loading…
Cancel
Save