diff options
Diffstat (limited to 'ext/xml')
| -rwxr-xr-x | ext/xml/tests/xml_closures_001.phpt | 47 | ||||
| -rw-r--r-- | ext/xml/xml.c | 2 |
2 files changed, 48 insertions, 1 deletions
diff --git a/ext/xml/tests/xml_closures_001.phpt b/ext/xml/tests/xml_closures_001.phpt new file mode 100755 index 0000000000..5439a2a918 --- /dev/null +++ b/ext/xml/tests/xml_closures_001.phpt @@ -0,0 +1,47 @@ +--TEST-- +XML parser test using closures as callbacks +--SKIPIF-- +<?php include("skipif.inc"); ?> +--INI-- +magic_quotes_runtime=0 +--FILE-- +<?php +chdir(dirname(__FILE__)); + +$start_element = function ($xp, $elem, $attribs) +{ + print "<$elem"; + if (sizeof($attribs)) { + while (list($k, $v) = each($attribs)) { + print " $k=\"$v\""; + } + } + print ">\n"; +}; + +$end_element = function ($xp, $elem) +{ + print "</$elem>\n"; +}; + +$xp = xml_parser_create(); +xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); +xml_set_element_handler($xp, $start_element, $end_element); +$fp = fopen("xmltest.xml", "r"); +while ($data = fread($fp, 4096)) { + xml_parse($xp, $data, feof($fp)); +} +xml_parser_free($xp); + +?> +--EXPECT-- +<root id="elem1"> +<elem1> +<elem2> +<elem3> +<elem4> +</elem4> +</elem3> +</elem2> +</elem1> +</root> diff --git a/ext/xml/xml.c b/ext/xml/xml.c index b276f8d892..6f8ff34210 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -508,7 +508,7 @@ static void xml_set_handler(zval **handler, zval **data) } /* IS_ARRAY might indicate that we're using array($obj, 'method') syntax */ - if (Z_TYPE_PP(data) != IS_ARRAY) { + if (Z_TYPE_PP(data) != IS_ARRAY && Z_TYPE_PP(data) != IS_OBJECT) { convert_to_string_ex(data); if (Z_STRLEN_PP(data) == 0) { |
