#37440 [Fbk->Opn]: Problem assigning multiple objects with XML parser within them to one variable
| From: | kenashkov at gmail dot com | Date: | Sat, 22 Jul 2006 15:22:19 +0000 |
| Subject: | #37440 [Fbk->Opn]: Problem assigning multiple objects with XML parser within them to one variable | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-99753@lists.php.net to get a copy of this message | ||
ID: 37440
User updated by: kenashkov at gmail dot com
Reported By: kenashkov at gmail dot com
-Status: Feedback
+Status: Open
Bug Type: XML related
Operating System: Fedora Core 4
PHP Version: 4.4.2
New Comment:
This can be reproduced useing the example from xml_set_object()
function reference found here:
http://www.php.net/manual/en/function.xml-set-object.php
Here is the exact reproduce code:
-------------------------------------
<?php
class xml {
var $parser;
function xml()
{
$this->parser = xml_parser_create();
xml_set_object($this->parser, $this);
xml_set_element_handler($this->parser, "tag_open",
"tag_close");
xml_set_character_data_handler($this->parser, "cdata");
}
function parse($data)
{
xml_parse($this->parser, $data);
}
function tag_open($parser, $tag, $attributes)
{
var_dump($parser, $tag, $attributes);
}
function cdata($parser, $cdata)
{
var_dump($parser, $cdata);
}
function tag_close($parser, $tag)
{
var_dump($parser, $tag);
}
} // end of class xml
$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
?>
-------------------------------------
The only modification in comparison with the given example in the
manual is the second assignment of $xml_parser to a new object.
The result is:
-------------------------------------
resource(2) of type (xml) string(1) "A" array(1) { ["ID"]=> string(5)
"hallo" } resource(2) of type (xml) string(3) "PHP" resource(2) of type
(xml) string(1) "A"
Warning: xml_parse() [function.xml-parse.html]: Unable to call handler
tag_open() in /home/local/dev.kenashkov.com/XPATS/bug_test/t4.php on
line 16
Warning: xml_parse() [function.xml-parse.html]: Unable to call handler
cdata() in /home/local/dev.kenashkov.com/XPATS/bug_test/t4.php on line
16
Warning: xml_parse() [function.xml-parse.html]: Unable to call handler
tag_close() in /home/local/dev.kenashkov.com/XPATS/bug_test/t4.php on
line 16
-------------------------------------
It works as expected in PHP 5.1.4
The code produces the bug in PHP 4.4.2 with the following cofigure
line:
-------------------------------------
'./configure' '--prefix=/web/php4.4.2'
'--with-apxs2=/web/apache2-php4/bin/apxs' '--enable-bcmath=shared'
'--with-bz2=shared' '--enable-calendar=shared' '--enable-ctype=shared'
'--with-curl=shared' '--enable-dba=shared' '--enable-dbase=shared'
'--enable-dbx=shared' '--enable-dio=shared' '--with-dom=shared'
'--with-dom-xsl=shared' '--with-dom-xslt=shared'
'--with-dom-exslt=shared' '--enable-exif=shared' '--with-fam=shared'
'--enable-ftp=shared' '--with-gettext=shared' '--with-gmp=shared'
'--with-iconv=shared' '--with-gd=shared' '--with-jpeg-dir'
'--with-png-dir' '--with-xpm-dir' '--with-ttf'
'--with-freetype-dir'
'--enable-gd-native-ttf' '--with-ldap=shared' '--enable-mbstring=all'
'--enable-mbstr-enc-trans' '--enable-mbregex'
'--with-mime-magic=shared'
'--with-mysql=/web/mysql-max-5.0.15-linux-i686-glibc23'
'--with-ncurses=shared' '--with-openssl=shared'
'--enable-overload=shared' '--enable-pcntl=shared'
'--with-pgsql=shared' '--with-regex' '--enable-maintainer-zts'
'--enable-sysvsem=shared' '--enable-sysvshm=shared'
'--enable-sysvmsg=shared' '--enable-shmop=shared'
'--enable-sockets=shared' '--enable-memory-limit'
'--enable-wddx=shared' '--with-zlib=shared' '--with-mhash=shared'
'--with-mcrypt=shared' '--enable-xslt=shared' '--with-xslt-sablot'
'--with-mssql=shared' '--with-kerberos=shared' '--enable-yp'
'--enable-fastcgi' '--with-oci8=/u01/app/oracle/product/10.1.0/Db_1'
-------------------------------------
Previous Comments:
------------------------------------------------------------------------
[2006-07-22 13:00:05] sniper@php.net
Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves.
A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external
resources such as databases, etc.
If possible, make the script source available online and provide
an URL to it here. Try to avoid embedding huge scripts into the report.
------------------------------------------------------------------------
[2006-05-14 20:33:05] kenashkov at gmail dot com
No - it is not. I have a full working example class - the same result.
The inexpected here is that the parser can not call the registered
methods. Obviuosly I do not expect to work - the source is scaled down
to the bare minimum that reproduces the case.
------------------------------------------------------------------------
[2006-05-14 20:29:16] tony2001@php.net
This is expected since your handlers do not return anything.
------------------------------------------------------------------------
[2006-05-14 20:11:51] kenashkov at gmail dot com
Description:
------------
When assigning multiple times to ane variable an object which contains
a XML parser, there is a problem when the xml_parse is called. The
parser can not call the registered handlers.
The problem can be avoided if the variable is unset before the second
call, or using $doc1 =& new xml_doc() for every assignment.
Reproduce code:
---------------
<?
class xml_doc
{
function xml_doc()
{
$this->res = xml_parser_create_ns();
xml_set_object($this->res,$this);
xml_set_element_handler($this->res,'start_element','end_element');
}
function load_string($string)
{
xml_parse($this->res,$string);
}
function start_element()
{
}
function end_element()
{
}
}
$str = '<?xml version="1" encoding="UTF-8"
standalone="yes"?><root></root>';
$doc1 = new xml_doc();
$doc1->load_string($str);
//unset($doc1);//this solves the problem
//or using $doc1 =& new xml_doc(); in every assignment
$doc1 = new xml_doc();
$doc1->load_string($str);
?>
Expected result:
----------------
Nothing really... it is too simple to do real parsing.
Actual result:
--------------
Warning: xml_parse() [function.xml-parse.html]: Unable to call handler
start_element() in file.php on line 13
Warning: xml_parse() [function.xml-parse.html]: Unable to call handler
end_element() in file.php on line 13
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=37440&edit=1