Re: PHP5: DOMDocument loadXML bug
| From: | Christian Stocker | Date: | Fri, 19 Nov 2004 09:08:54 +0000 |
| Subject: | Re: PHP5: DOMDocument loadXML bug | ||
| References: | 1 | Groups: | php.xml.dev |
| Request: | Send a blank email to php-xml-dev+get-514@lists.php.net to get a copy of this message | ||
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 {-- 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 | chregu@bitflux.ch | gnupg-keyid 0x5CE1DECBpublic 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 somelittle 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 donot 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