From: Operating system: Fedora / Debian PHP version: 5.3.6 Package: DOM XML related Bug Type: Bug Bug description:inconsistant namespace behaviour with DocumentFragment
Description: ------------ In an XML document, when an xmlns attribute is present, all child elements of that element are also considered to be in that namespace. When a DocumentFragment is created and the root element contains an xmlns attribute this is the behaviour currently displayed by PHP. However if a documentfragment is appended to an element already present in the DOM which contains an xmlns, the appended fragment appears to be assigned a default 'null' namespace. Test script: --------------- Scenario 1: xmlns is present in the fragment. <?php const BLAH_NS = 'http://blah.com/blah'; $xml = ' <root> <foo> <bar /> </foo> </root> '; $fragXML = '<content xmlns="'.BLAH_NS.'"><sneh>some</sneh><grah>here</grah><ul><li>one</li><li>two</li><li>three</li></ul></content>'; $doc = new DOMDocument('1.0','UTF-8'); $doc->formatOutput = true; $doc->preserveWhiteSpace = false; $doc->loadXML( $xml ); $xpath = new DOMXPath( $doc ); $barElement = $xpath->query( '//bar' )->item(0); // create a new element with xmlns="http://blah.com/blah" . The expectation is that // every child of this node will be part of this namespace as per the section on default // name spaces http://www.w3schools.com/XML/xml_namespaces.asp // create a new document Fragment $DOMFragment = $doc->createDocumentFragment(); $DOMFragment->appendXML( $fragXML ); // Attach the fragment to the rest of the document $barElement->appendChild( $DOMFragment ); // all good so far echo $doc->saveXML(); // register the bar name space so we can perform a lookup $xpath->registerNamespace('b', BLAH_NS); echo "\n\n\n"; // this doesn't work $grahElement = $xpath->query( '//b:grah' )->item(0); echo "Find //b:grah " .$grahElement->nodeValue."\n"; // this works $grahElement = $xpath->query( '//grah' )->item(0); echo "Find //grah ".$grahElement->nodeValue."\n"; ?> Scenario 2: The xmlns attribute is present on the element the fragment is attached to <?php const BLAH_NS = 'http://blah.com/blah'; $xml = ' <root> <foo> <bar /> </foo> </root> '; $fragXML = '<sneh>some</sneh><grah>here</grah><ul><li>one</li><li>two</li><li>three</li></ul>'; $doc = new DOMDocument('1.0','UTF-8'); $doc->formatOutput = true; $doc->preserveWhiteSpace = false; $doc->loadXML( $xml ); $xpath = new DOMXPath( $doc ); $barElement = $xpath->query( '//bar' )->item(0); // create a new element with xmlns="http://blah.com/blah" . The expectation is that // every child of this node will be part of this namespace as per the section on default // name spaces http://www.w3schools.com/XML/xml_namespaces.asp $contentElement = $doc->createElementNS( BLAH_NS, 'content' ); $barElement->appendChild( $contentElement ); // create a new document Fragment $DOMFragment = $doc->createDocumentFragment(); $DOMFragment->appendXML( $fragXML ); // Attach the fragment to the rest of the document $contentElement->appendChild( $DOMFragment ); // all good so far echo $doc->saveXML(); // register the bar name space so we can perform a lookup $xpath->registerNamespace('b', BLAH_NS); echo "\n\n\n"; // this doesn't work $grahElement = $xpath->query( '//b:grah' )->item(0); echo "Find //b:grah " .$grahElement->nodeValue."\n"; // this works $grahElement = $xpath->query( '//grah' )->item(0); echo "Find //grah ".$grahElement->nodeValue."\n"; ?> Expected result: ---------------- In both cases I would expect the output of: Find //b:grah here Find //grah Actual result: -------------- Find //b:grah Find //grah grahtest -- Edit bug report at http://bugs.php.net/bug.php?id=54905&edit=1 -- Try a snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=54905&r=trysnapshot52 Try a snapshot (PHP 5.3): http://bugs.php.net/fix.php?id=54905&r=trysnapshot53 Try a snapshot (trunk): http://bugs.php.net/fix.php?id=54905&r=trysnapshottrunk Fixed in SVN: http://bugs.php.net/fix.php?id=54905&r=fixed Fixed in SVN and need be documented: http://bugs.php.net/fix.php?id=54905&r=needdocs Fixed in release: http://bugs.php.net/fix.php?id=54905&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=54905&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=54905&r=needscript Try newer version: http://bugs.php.net/fix.php?id=54905&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=54905&r=support Expected behavior: http://bugs.php.net/fix.php?id=54905&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=54905&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=54905&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=54905&r=globals PHP 4 support discontinued: http://bugs.php.net/fix.php?id=54905&r=php4 Daylight Savings: http://bugs.php.net/fix.php?id=54905&r=dst IIS Stability: http://bugs.php.net/fix.php?id=54905&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=54905&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=54905&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=54905&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=54905&r=mysqlcfg