@@ -355,6 +355,15 @@ PHP_METHOD(DOMElement, getAttributeNames)
355355}
356356/* }}} end DOMElement::getAttributeNames() */
357357
358+ static xmlNodePtr dom_create_attribute (xmlNodePtr nodep , const char * name , const char * value )
359+ {
360+ if (xmlStrEqual ((xmlChar * )name , (xmlChar * )"xmlns" )) {
361+ return (xmlNodePtr ) xmlNewNs (nodep , (xmlChar * )value , NULL );
362+ } else {
363+ return (xmlNodePtr ) xmlSetProp (nodep , (xmlChar * ) name , (xmlChar * )value );
364+ }
365+ }
366+
358367/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082
359368Since:
360369*/
@@ -405,23 +414,40 @@ PHP_METHOD(DOMElement, setAttribute)
405414
406415 }
407416
408- if (xmlStrEqual ((xmlChar * )name , (xmlChar * )"xmlns" )) {
409- if (xmlNewNs (nodep , (xmlChar * )value , NULL )) {
410- RETURN_TRUE ;
411- }
412- } else {
413- attr = (xmlNodePtr )xmlSetProp (nodep , (xmlChar * ) name , (xmlChar * )value );
414- }
417+ attr = dom_create_attribute (nodep , name , value );
415418 if (!attr ) {
416419 zend_argument_value_error (1 , "must be a valid XML attribute" );
417420 RETURN_THROWS ();
418421 }
422+ if (attr -> type == XML_NAMESPACE_DECL ) {
423+ RETURN_TRUE ;
424+ }
419425
420426 DOM_RET_OBJ (attr , & ret , intern );
421427
422428}
423429/* }}} end dom_element_set_attribute */
424430
431+ static bool dom_remove_attribute (xmlNodePtr attrp )
432+ {
433+ ZEND_ASSERT (attrp != NULL );
434+ switch (attrp -> type ) {
435+ case XML_ATTRIBUTE_NODE :
436+ if (php_dom_object_get_data (attrp ) == NULL ) {
437+ node_list_unlink (attrp -> children );
438+ xmlUnlinkNode (attrp );
439+ xmlFreeProp ((xmlAttrPtr )attrp );
440+ } else {
441+ xmlUnlinkNode (attrp );
442+ }
443+ break ;
444+ case XML_NAMESPACE_DECL :
445+ return false;
446+ EMPTY_SWITCH_DEFAULT_CASE ();
447+ }
448+ return true;
449+ }
450+
425451/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9
426452Since:
427453*/
@@ -450,23 +476,7 @@ PHP_METHOD(DOMElement, removeAttribute)
450476 RETURN_FALSE ;
451477 }
452478
453- switch (attrp -> type ) {
454- case XML_ATTRIBUTE_NODE :
455- if (php_dom_object_get_data (attrp ) == NULL ) {
456- node_list_unlink (attrp -> children );
457- xmlUnlinkNode (attrp );
458- xmlFreeProp ((xmlAttrPtr )attrp );
459- } else {
460- xmlUnlinkNode (attrp );
461- }
462- break ;
463- case XML_NAMESPACE_DECL :
464- RETURN_FALSE ;
465- default :
466- break ;
467- }
468-
469- RETURN_TRUE ;
479+ RETURN_BOOL (dom_remove_attribute (attrp ));
470480}
471481/* }}} end dom_element_remove_attribute */
472482
0 commit comments