mirror of
https://github.com/php/php-src.git
synced 2024-11-28 04:14:26 +08:00
Fix bug #54382 (getAttributeNodeNS doesn't get xmlns* attributes)
The fix is based on the same strategy for handling namespace declarations as used by getAttributeNode. Note that this strategy makes these methods not return a DOMAttr for xmlns* attributes, but an instance of the (undocumented) class DOMNameSpaceNode. This is not really ideal, but at least this fix makes the behavior of getAttributeNode and getAttributeNodeNS consistent. A follow-up action would be to investigate whether DOMNameSpaceNode can be made into a subclass of DOMAttr (which may be hard due to the way libxml treats namespace declarations) or document this deviating return value for xmlns* attributes.
This commit is contained in:
parent
737ee0661c
commit
721a189742
@ -921,7 +921,7 @@ Since: DOM Level 2
|
||||
PHP_FUNCTION(dom_element_get_attribute_node_ns)
|
||||
{
|
||||
zval *id;
|
||||
xmlNodePtr elemp;
|
||||
xmlNodePtr elemp, fakeAttrp;
|
||||
xmlAttrPtr attrp;
|
||||
dom_object *intern;
|
||||
size_t uri_len, name_len;
|
||||
@ -937,10 +937,34 @@ PHP_FUNCTION(dom_element_get_attribute_node_ns)
|
||||
attrp = xmlHasNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
|
||||
|
||||
if (attrp == NULL) {
|
||||
RETURN_NULL();
|
||||
}
|
||||
if (xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
|
||||
xmlNsPtr nsptr;
|
||||
nsptr = dom_get_nsdecl(elemp, (xmlChar *)name);
|
||||
if (nsptr != NULL) {
|
||||
xmlNsPtr curns;
|
||||
curns = xmlNewNs(NULL, nsptr->href, NULL);
|
||||
if (nsptr->prefix) {
|
||||
curns->prefix = xmlStrdup((xmlChar *) nsptr->prefix);
|
||||
}
|
||||
if (nsptr->prefix) {
|
||||
fakeAttrp = xmlNewDocNode(elemp->doc, NULL, (xmlChar *) nsptr->prefix, nsptr->href);
|
||||
} else {
|
||||
fakeAttrp = xmlNewDocNode(elemp->doc, NULL, (xmlChar *)"xmlns", nsptr->href);
|
||||
}
|
||||
fakeAttrp->type = XML_NAMESPACE_DECL;
|
||||
fakeAttrp->parent = elemp;
|
||||
fakeAttrp->ns = curns;
|
||||
|
||||
DOM_RET_OBJ((xmlNodePtr) attrp, &ret, intern);
|
||||
DOM_RET_OBJ(fakeAttrp, &ret, intern);
|
||||
} else {
|
||||
RETURN_NULL();
|
||||
}
|
||||
} else {
|
||||
RETURN_NULL();
|
||||
}
|
||||
} else {
|
||||
DOM_RET_OBJ((xmlNodePtr) attrp, &ret, intern);
|
||||
}
|
||||
|
||||
}
|
||||
/* }}} end dom_element_get_attribute_node_ns */
|
||||
|
Loading…
Reference in New Issue
Block a user