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