rrichards Mon Aug 28 23:37:23 2006 UTC
Modified files:
/php-src/ext/dom element.c
/php-src/ext/dom/tests bug38474.phpt
Log:
MFB: fix #38474 (getAttribute select attribute by order, even when prefixed)
add test
http://cvs.php.net/viewvc.cgi/php-src/ext/dom/element.c?r1=1.46&r2=1.47&diff_format=u
Index: php-src/ext/dom/element.c
diff -u php-src/ext/dom/element.c:1.46 php-src/ext/dom/element.c:1.47
--- php-src/ext/dom/element.c:1.46 Fri Aug 4 18:11:27 2006
+++ php-src/ext/dom/element.c Mon Aug 28 23:37:23 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: element.c,v 1.46 2006/08/04 18:11:27 rrichards Exp $ */
+/* $Id: element.c,v 1.47 2006/08/28 23:37:23 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -188,7 +188,24 @@
/* }}} */
-
+static xmlAttrPtr dom_get_dom1_attribute(xmlNodePtr elem, xmlChar *name) {
+ int len;
+ const xmlChar *nqname;
+
+ nqname = xmlSplitQName3(name, &len);
+ if (nqname != NULL) {
+ xmlNsPtr ns;
+ xmlChar *prefix = xmlStrndup(name, len);
+ ns = xmlSearchNs(elem->doc, elem, prefix);
+ if (prefix != NULL) {
+ xmlFree(prefix);
+ }
+ if (ns != NULL) {
+ return xmlHasNsProp(elem, nqname, ns->href);
+ }
+ }
+ return xmlHasNsProp(elem, name, NULL);
+}
/* {{{ proto string dom_element_get_attribute(string name);
URL:
http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9
@@ -198,8 +215,9 @@
{
zval *id;
xmlNode *nodep;
- char *name, *value;
+ char *name, *value = NULL;
dom_object *intern;
+ xmlAttrPtr attr;
int name_len;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
"Os", &id, dom_element_class_entry, &name, &name_len) == FAILURE) {
@@ -208,7 +226,15 @@
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
- value = xmlGetProp(nodep, name);
+ attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
+ if (attr) {
+ if (attr->type == XML_ATTRIBUTE_NODE) {
+ value = xmlNodeListGetString(attr->doc, attr->children,
1);
+ } else {
+ value =
xmlStrdup(((xmlAttributePtr)attr)->defaultValue);
+ }
+ }
+
if (value == NULL) {
RETURN_EMPTY_TEXT();
} else {
@@ -248,7 +274,7 @@
RETURN_FALSE;
}
- attr = xmlHasProp(nodep,name);
+ attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
if (attr != NULL && attr->type != XML_ATTRIBUTE_DECL) {
node_list_unlink(attr->children TSRMLS_CC);
}
@@ -288,7 +314,7 @@
RETURN_FALSE;
}
- attrp = xmlHasProp(nodep,name);
+ attrp = dom_get_dom1_attribute(nodep, (xmlChar *)name);
if (attrp == NULL) {
RETURN_FALSE;
}
@@ -327,7 +353,7 @@
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
- attrp = xmlHasProp(nodep,name);
+ attrp = dom_get_dom1_attribute(nodep, (xmlChar *)name);
if (attrp == NULL) {
RETURN_FALSE;
}
@@ -851,8 +877,9 @@
zval *id;
xmlNode *nodep;
dom_object *intern;
- char *name, *value;
+ char *name;
int name_len;
+ xmlAttrPtr attr;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
"Os&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv)) ==
FAILURE) {
return;
@@ -860,11 +887,10 @@
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
- value = xmlGetProp(nodep, name);
- if (value == NULL) {
+ attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
+ if (attr == NULL) {
RETURN_FALSE;
} else {
- xmlFree(value);
RETURN_TRUE;
}
}
http://cvs.php.net/viewvc.cgi/php-src/ext/dom/tests/bug38474.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/dom/tests/bug38474.phpt
diff -u /dev/null php-src/ext/dom/tests/bug38474.phpt:1.2
--- /dev/null Mon Aug 28 23:37:23 2006
+++ php-src/ext/dom/tests/bug38474.phpt Mon Aug 28 23:37:23 2006
@@ -0,0 +1,41 @@
+--TEST--
+Bug #38474 (getAttribute select attribute by order, even when prefixed)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$xml = b'<node xmlns:pre="http://foo.com/tr/pre"
+ xmlns:post="http://foo.com/tr/post"
+ pre:type="bar" type="foo" ><sub /></node>';
+$dom = new DomDocument();
+$dom->loadXML($xml);
+echo $dom->firstChild->getAttribute('type')."\n";
+echo $dom->firstChild->getAttribute('pre:type')."\n";
+
+$dom->firstChild->setAttribute('pre:type', 'bar2');
+$dom->firstChild->setAttribute('type', 'foo2');
+$dom->firstChild->setAttribute('post:type', 'baz');
+$dom->firstChild->setAttribute('new:type', 'baz2');
+
+echo $dom->firstChild->getAttribute('type')."\n";
+echo $dom->firstChild->getAttribute('pre:type')."\n";
+echo $dom->firstChild->getAttribute('post:type')."\n";
+
+$dom->firstChild->removeAttribute('pre:type');
+$dom->firstChild->removeAttribute('type');
+
+echo $dom->firstChild->getAttribute('type')."\n";
+echo $dom->firstChild->getAttribute('pre:type')."\n";
+echo $dom->firstChild->getAttribute('post:type')."\n";
+echo $dom->firstChild->getAttribute('new:type');
+?>
+--EXPECT--
+foo
+bar
+foo2
+bar2
+baz
+
+
+baz
+baz2
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php