tags:

views:

472

answers:

1

I've got a DOMNode object that has some attributes. $Node->attributes is a DOMNamedNodeMap, which has no methods for removing one of the entries in the map. The DOMNode class also has no methods for removing attributes from an element. I've looked through a number of the other related classes and none of them seem to provide a mechanism for removing an attribute node from its parent. (DOMNode::removeChild doesn't work; it throws a "Not found error" if I pass a DOMAttr object to it.)

Aside from constructing a new DOMNamedNodeMap and adding all the attributes to it except the one I don't want... any ideas? Thanks.

+2  A: 

If you've got a DOMNode that has some attributes, it must be a DOMElement. In which case you should be able to call removeAttribute/removeAttributeNS/removeAttributeNode on it.

It is somewhat curious that PHP's DOMNamedNodeMap documents getNamedItem[NS] but does not acknowledge the existence setNamedItem[NS] and removeNamedItem[NS], which would have been another way of doing it.

DOMNode::removeChild can't work because a DOMAttr is not a child of another DOMNode; ‘attributes’ is a separate space to ‘childNodes’. You also can't create a new NamedNodeMap on its own to write to DOMNode::attributes, as that's a read-only property.

bobince
That was it! Thank you. I hadn't yet grokked that the DOMNode would also be a DOMElement. That's what I get for not using ReflectionClass::export() enough :)
dirtside