ID:               45253
 User updated by:  erudd at netfor dot com
 Reported By:      erudd at netfor dot com
 Status:           Open
 Bug Type:         SimpleXML related
 Operating System: Linux
 PHP Version:      5.2.6
 New Comment:

Is addAttribute supposed to work the same way as addChild?? As
currently it does not (tested in 5.2.5 and 5.2.6)

Also

$xml = new SimpleXmlElement('<test/>');
$xml['attribute'] = "my val";

does not work it throws an error (5.2.6) claiming that the "objects
don't support array access operators".


Previous Comments:
------------------------------------------------------------------------

[2008-06-13 19:50:34] erudd at netfor dot com

OK.. that code works fine on PHP 5.2.4, 5.2.5, and 5.2.6. However if
you don't predefine the element and update it's contents it was
expecting it to be "escaped".  Which is fixed on my fresh build of
5.2.6. (though wasn't clearly documented in the changelog (bug #44478))

(I have multiple version of PHP, that I'm unifying up to current).

Still,  this behavior is not documented in the documentation.

Should I file a new bug on the documentation to have it updated? or
just switch this one to "Add* methods for simpleXML need documentation
updated to show that input needs to be xml entity encoded"?

------------------------------------------------------------------------

[2008-06-13 15:50:00] maito dot gai at gmail dot com

That's not SimpleXML's normal behaviour, and I couldn't reproduce it on
PHP 5.2.6-pl1-gentoo (cli) (built: May 26 2008 02:58:50) + libxml
2.6.31

Check out your PHP version and libxml version, perhaps you're
unknowingly running an older release.


Reproduce code:
---------------
$sxml=new SimpleXMLElement('<test></test>');

$sxml->child1 = 'One & Two';
echo $sxml->child1, "\n";

$sxml->child1 = 'One &amp; Two';
echo $sxml->child1, "\n";

Actual result:
--------------
One & Two
One &amp; Two

------------------------------------------------------------------------

[2008-06-13 01:40:27] erudd at netfor dot com

However when I do 
$xml->child = 'One & Two';

it does not work it results in 

echo (string)$xml->child;

printing "One ";

As I tried doing that to see if it was just the "function" being ODD or
the whole SimpleXML.

Basically this behavior has made simpleXML useless to me now.  I either
have to use the standard DOM interface, use XMLWriter (which I ended up
rewriting the code that had this issue to use XMLWriter instead).  OR
write my own wrapper class around simpleXML that does the same behavior
with respect to escaping that the rest of the XML APIs in PHP do.

------------------------------------------------------------------------

[2008-06-13 00:50:48] maito dot gai at gmail dot com

You can have simplicity or completeness, but you can't have them both
at the same time. SimpleXML offers simplicity through its magic method
($sxml->child) and completeness through addChild().

If you don't want to bother with escaping, use
   $sxml->child1 = 'One & Two';

If you need to bypass escaping, use
   $sxml->addChild('child1', 'One &amp; Two');

Without addChild(), or if addChild() was identical to the magic method,
it would be impossible to use XML entities, eg &#160; would need to be
replaced by the actual character if the document's encoding. And if that
character was not available in that encoding (or charset, rather) then
it would simply be impossible to use.

That's why addChild()'s behaviour is both desirable and needed.

------------------------------------------------------------------------

[2008-06-12 21:46:33] erudd at netfor dot com

The XMLWriter extension escapes my input for me as expected instead of
requiring me to escape the input first.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/45253

-- 
Edit this bug report at http://bugs.php.net/?id=45253&edit=1

Reply via email to