ID: 36756
User updated by: olaf at 7val dot com
Reported By: olaf at 7val dot com
-Status: Bogus
+Status: Open
Bug Type: DOM XML related
Operating System: Linux
PHP Version: 5.1.2
New Comment:
I double checked documentation, node corruption is not mentioned
there.
if the return value of removeChild is assigned to a variable,
everything works as expected:
-----------------8<---------------
$dom = DOMDocument::loadXML('<root><child/></root>');
$xpath = new DOMXpath($dom);
$node = $xpath->query('//child')->item(0);
echo $node->nodeName . "\n";
$res = $GLOBALS['dom']->removeChild($GLOBALS['dom']->firstChild);
echo "nodeType: " . $node->nodeType . "\n";
echo "nodeName: " .$node->nodeName . "\n";
echo "parentNode: " .$node->parentNode . "\n";
---------------->8--------------------
if the return value is ignored:
----------------------------8<---------------
$dom = DOMDocument::loadXML('<root><child/></root>');
$xpath = new DOMXpath($dom);
$node = $xpath->query('//child')->item(0);
echo $node->nodeName . "\n";
$GLOBALS['dom']->removeChild($GLOBALS['dom']->firstChild);
echo "nodeType: " . $node->nodeType . "\n";
echo "nodeName: " .$node->nodeName . "\n";
echo "parentNode: " .$node->parentNode . "\n";
-------------------------->8------------
or goes out of scope:
--------------------8<-----------
$dom = DOMDocument::loadXML('<root><child/></root>');
$xpath = new DOMXpath($dom);
$node = $xpath->query('/root/child')->item(0);
echo $node->nodeName;
function test()
{
$x = $GLOBALS['dom']->removeChild($GLOBALS['dom']->firstChild);
}
test();
echo $node->nodeName;
-------------------->8-----------
$node gets corrupted.
Previous Comments:
------------------------------------------------------------------------
[2006-03-16 11:20:57] [EMAIL PROTECTED]
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php
------------------------------------------------------------------------
[2006-03-16 09:47:53] olaf at 7val dot com
Description:
------------
Using DOMDocument::removeChild corrupts node in the document in some
cases.
Given a node $node and removing a parent node of this node renders
$node unusable (properties are gone, but $node is still of class
DOMElement).
Reproduce code:
---------------
<?php
// This works as expected
$dom = DOMDocument::loadXML('<root><child/></root>');
$xpath = new DOMXpath($dom);
$node = $xpath->query('/root')->item(0);
echo $node->nodeName . "\n";
$dom->removeChild($GLOBALS['dom']->firstChild);
echo "nodeType: " . $node->nodeType . "\n";
echo "nodeName: " .$node->nodeName . "\n";
echo "parentNode: " .$node->parentNode . "\n";
// This breaks "$node"
$dom = DOMDocument::loadXML('<root><child/></root>');
$xpath = new DOMXpath($dom);
$node = $xpath->query('//child')->item(0);
echo $node->nodeName . "\n";
$GLOBALS['dom']->removeChild($GLOBALS['dom']->firstChild);
echo "nodeType: " . $node->nodeType . "\n";
echo "nodeName: " .$node->nodeName . "\n";
echo "parentNode: " .$node->parentNode . "\n";
echo "\n";
?>
Expected result:
----------------
Properties of $node should still exists, see part1:
root
nodeType: 1
nodeName: root
parentNode:
Actual result:
--------------
Properties are gone
child
Notice: Undefined property: DOMElement::$nodeType in
/home/olaf/test/test.php on line 20
nodeType:
Notice: Undefined property: DOMElement::$nodeName in
/home/olaf/test/test.php on line 21
nodeName:
Notice: Undefined property: DOMElement::$parentNode in
/home/olaf/test/test.php on line 22
parentNode:
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=36756&edit=1