Re: [PHP-XML-DEV] PHP5: DOMDocument loadXML bug

[email protected] (Christian Stocker) Fri, 19 Nov 2004 10:08:54 +0100
Newsgroups php.xml.dev
Message-ID <[email protected]>
Not a bug. Expected behaviour.

See http://php5.bitflux.org/xmloncrack/slide_14.php

chreug

On 11.11.2004 22:17 Uhr, Vivian Steller wrote:
> good evening at all,
> 
> i found out some strange behaviour with the DOMDocument::loadXML method (of
> php5.0.3dev build from oct 31, 2004, hadn't the time to check some new
> version, sorry).
> 
> to put it in a nutshell the problem concerns extending
> DOMDocument/DOMElement and overloading the loadXML method, maybe other
> methods, too.
> 
> please have a look at the following code and the comments document the
> output:
> 
> ######################### CODE START #########################
> 
> <pre>
> <?php
>  
> class MyDOMElement extends DOMElement {
>         public function test() {
>                 print("ok");
>         }
> }
> 
> class MyDOMDocument extends DOMDocument {
>         public function loadXML($xml) {
>                 parent::loadXML($xml);
>                 $newRoot = new MyDOMElement("newroot", "value");
>                 print $newRoot->test() . "\n";
>                 $newRoot = $this->importNode($newRoot);
>                 
>                 // we want to change the current root element to another one...
>                 $this->replaceChild($newRoot, $this->documentElement);
>                 print $this->documentElement->nodeName . "\n";
>                 // returns "newroot", worked fine so far, but...
>                 
>                 print get_class($this->documentElement) . "\n";
>                 // returns "DOMElement", thus seems to me importNode($node) makes a
> $this->createElement($node->nodeName, $node->nodeValue) internally?
>                 // ok, if this behaviour couldn't be changed, we maybe could include some
> little work-around and write our own importNode func...
>                 
>                 // BUT EVEN THAT WOULDN'T WORK, because ...
>                 $anotherRoot = $this->createElement("anotherRoot");
>                 // now we used the doc itself to create the node and consequently we do
> not need to import the node...
>                 $this->removeChild($this->documentElement);     // we go the really basic way
>                 $this->appendChild($anotherRoot);
>                 
>                 print get_class($this->documentElement) . "\n";
>                 // returns "MyDOMClass" quite right, root is now a MyDOMElement,
>                 // but see the comments below...
>         }
>         
>         public function createElement($name, $value = "") {
>                 return new MyDOMElement($name, $value);
>         }
> }
> 
> $doc = new MyDOMDocument();
> $doc->loadXML("<root/>");
> print(htmlspecialchars($doc->saveXML()));
> // here the result is right: ".. <anotherElement/>", but ...
> 
> // print_r($doc->documentElement->test());
> // throws a "Fatal error:  Call to undefined method DOMElement::test() 
> //      in .../domdocument.php on line xx" <- the commented line above (47)...
> // and if you  
> print get_class($doc->documentElement) . "\n";
> // the result is again "DOMElement"?!
> 
> // strange behaviour, i think?!
> ?>
> </pre>
> 
> 
> ####################### CODE END ##########################
> 
> as you can see, inside the loadxml method, everything (disregarding
> importNode) works fine. but leaving the method, php seems to do something
> "magic" in the background, isn't it?
> 
> If it is the case, would there be a possibility to fix this bug untill one
> of the next releases? that would really be great...
> 
> sorry if i post (possibly) bugs here, but i'm not familiar with the bug
> system yet and this is the fastest way to get through to the developers:)
> 
> thanks in advance...
> 
> vivian
> 

-- 
christian stocker | Bitflux GmbH | schoeneggstrasse 5 | ch-8004 zurich
phone +41 1 240 56 70 | mobile +41 76 561 88 60  | fax +41 1 240 56 71
http://www.bitflux.ch  |  [email protected]  |  gnupg-keyid 0x5CE1DECB