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

Reply via email to