diff options
Diffstat (limited to 'ext/dom/element.c')
-rw-r--r-- | ext/dom/element.c | 63 |
1 files changed, 31 insertions, 32 deletions
diff --git a/ext/dom/element.c b/ext/dom/element.c index c8e1aae3c2..ceffc972f2 100644 --- a/ext/dom/element.c +++ b/ext/dom/element.c @@ -107,10 +107,20 @@ Since: int dom_element_tag_name_read(dom_object *obj, zval **retval TSRMLS_DC) { xmlNodePtr nodep; + xmlNsPtr ns; + xmlChar *qname; nodep = dom_object_get_node(obj); ALLOC_ZVAL(*retval); - ZVAL_STRING(*retval, (char *) (nodep->name), 1); + ns = nodep->ns; + if (ns != NULL && ns->prefix) { + qname = xmlStrdup(ns->prefix); + qname = xmlStrcat(qname, ":"); + } + qname = xmlStrcat(qname, nodep->name); + ZVAL_STRING(*retval, qname, 1); + xmlFree(qname); + return SUCCESS; } @@ -309,14 +319,12 @@ PHP_FUNCTION(dom_element_set_attribute_node) existattrp = xmlHasProp(nodep, attrp->name); if (existattrp != NULL) { - if ((oldobj = dom_object_get_data((xmlNodePtr) existattrp)) == NULL) { - xmlUnlinkNode((xmlNodePtr) existattrp); - } else { - if (((node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp) { - RETURN_NULL(); - } - xmlUnlinkNode((xmlNodePtr) existattrp); + if ((oldobj = dom_object_get_data((xmlNodePtr) existattrp)) != NULL && + ((node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp) + { + RETURN_NULL(); } + xmlUnlinkNode((xmlNodePtr) existattrp); } if (attrp->doc == NULL && nodep->doc != NULL) { @@ -343,16 +351,15 @@ Since: */ PHP_FUNCTION(dom_element_remove_attribute_node) { - zval *id; + zval *id, *node, *rv = NULL; xmlNode *nodep; xmlAttr *attrp; - dom_object *intern; - int name_len; - char *name; + dom_object *intern, *attrobj; + int ret; DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) { return; } @@ -361,22 +368,16 @@ PHP_FUNCTION(dom_element_remove_attribute_node) RETURN_FALSE; } - attrp = xmlHasProp(nodep,name); - if (attrp == NULL) { + DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj); + + if (attrp->type != XML_ATTRIBUTE_NODE || attrp->parent != nodep) { + php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC); RETURN_FALSE; } - /* Check for registered nodes within attributes tree when attribute is not referenced - Unlink dependant nodes and free attribute if not registered */ - if (dom_object_get_data((xmlNodePtr) attrp) == NULL) { - node_list_unlink(attrp->children TSRMLS_CC); - xmlUnlinkNode((xmlNodePtr) attrp); - xmlFreeProp(attrp); - } else { - xmlUnlinkNode((xmlNodePtr) attrp); - } + xmlUnlinkNode((xmlNodePtr) attrp); - RETURN_TRUE; + DOM_RET_OBJ(rv, (xmlNodePtr) attrp, &ret, intern); } /* }}} end dom_element_remove_attribute_node */ @@ -684,14 +685,12 @@ PHP_FUNCTION(dom_element_set_attribute_node_ns) } if (existattrp != NULL) { - if ((oldobj = dom_object_get_data((xmlNodePtr) existattrp)) == NULL) { - xmlUnlinkNode((xmlNodePtr) existattrp); - } else { - if (((node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp) { - RETURN_NULL(); - } - xmlUnlinkNode((xmlNodePtr) existattrp); + if ((oldobj = dom_object_get_data((xmlNodePtr) existattrp)) != NULL && + ((node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp) + { + RETURN_NULL(); } + xmlUnlinkNode((xmlNodePtr) existattrp); } if (attrp->doc == NULL && nodep->doc != NULL) { |