ID:               36756
 Updated by:       [EMAIL PROTECTED]
 Reported By:      olaf at 7val dot com
-Status:           Open
+Status:           Assigned
 Bug Type:         DOM XML related
 Operating System: Linux
 PHP Version:      5.1.2
-Assigned To:      
+Assigned To:      rrichards
 New Comment:

Assigning to self. Node is not corrupted. It just doesn't exist. Try
calling $node->hasChildNodes() and you will see the warning. I'll look
at adding a warning when accessing properties in this case.

Behavior will not change. When subtree is unlinked and root of subtree
is not referenced entire subtree is released to avoid memory issues.
Changing this would slow down all tree based extensions (dom, simplexml
and xsl) drastically, so always reference the detached tree's root if
you want to use it again.


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

[2006-03-16 11:39:06] olaf at 7val dot com

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.

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

[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

Reply via email to