Edit report at https://bugs.php.net/bug.php?id=47531&edit=1
ID: 47531 Comment by: ekuratopen at spamavert dot com Reported by: sgunderson at bigfoot dot com Summary: No way of removing redundant xmlns: declarations Status: Assigned Type: Bug Package: DOM XML related Operating System: Debian PHP Version: 5.3CVS-2009-02-28 (snap) Assigned To: rrichards Block user comment: N Private report: N New Comment: > Since 5.3 (bug #38949) it seems I can getAttribute() the xmlns element, but > still not remove it it any reasonable way you may remove the namespace attribute by using --- $e = $doc->documentElement; $e->removeAttributeNS($e->getAttributeNode('xmlns')->nodeValue, ''); --- so you will not need to do registerNamespace() in DOMXPath if DOM has it for example Previous Comments: ------------------------------------------------------------------------ [2009-06-14 19:06:43] robin2009 at altruists dot org You can run DOMs through an XSLT identity transform to strip redundant namespaces, since this removes (what it deems to be) unused namespaces (i.e. namespaces which don't appear as elements or attributes). This method is not only slow for large DOMs, if you're working with XSDs or XSLTs, both of which use namespaces inside attribute values, it would need modification, since XSLT strips them. ------------------------------------------------------------------------ [2009-02-28 15:19:14] sgunderson at bigfoot dot com Description: ------------ There seems to be no good way of manipulating XML namespace declarations at all. In particular, they never get garbage collected in any way, and you cannot remove them manually, so they will stick around forever unless you create a new one. My typical use case is shown in the reproduce code below (although the element will typically have child elements). Since 5.3 (bug #38949) it seems I can getAttribute() the xmlns element, but still not remove it it any reasonable way (and it should really just disappear by itself; it does in other languages). Reproduce code: --------------- <?php $doc = new DOMDocument; $doc->loadXML('<html xmlns="something"><element xmlns:ns="whatever" ns:foo="bar" /></html>'); $root = $doc->documentElement; $elem = $root->firstChild; $elem->removeAttributeNode($elem->attributes->item(0)); print $doc->saveXML(); ?> Expected result: ---------------- <?xml version="1.0"?> <html xmlns="something"><element/></html> Actual result: -------------- <?xml version="1.0"?> <html xmlns="something"><element xmlns:ns="whatever"/></html> ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=47531&edit=1