summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/dom/document.c72
-rw-r--r--ext/dom/dom_ce.h1
-rw-r--r--ext/dom/element.c152
-rw-r--r--ext/dom/node.c23
-rw-r--r--ext/dom/php_dom.c42
-rw-r--r--ext/dom/xpath.c21
6 files changed, 147 insertions, 164 deletions
diff --git a/ext/dom/document.c b/ext/dom/document.c
index 90c6e5bad3..4982a6b7e8 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -852,13 +852,11 @@ Since:
PHP_FUNCTION(dom_document_get_elements_by_tag_name)
{
zval *id;
- xmlXPathContextPtr ctxp;
xmlDocPtr docp;
- xmlXPathObjectPtr xpathobjp;
+ xmlNodePtr elemp;
+ int name_len;
dom_object *intern;
-
- int name_len, ret;
- char *str,*name;
+ char *name;
DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern);
@@ -866,44 +864,10 @@ PHP_FUNCTION(dom_document_get_elements_by_tag_name)
return;
}
- ctxp = xmlXPathNewContext(docp);
-
- ctxp->node = NULL;
- str = (char*) safe_emalloc((name_len+3), sizeof(char), 0) ;
- sprintf(str ,"//%s",name);
-
- xpathobjp = xmlXPathEval(str, ctxp);
- efree(str);
- ctxp->node = NULL;
-
- if (!xpathobjp) {
- RETURN_FALSE;
- }
-
- if (xpathobjp->type == XPATH_NODESET) {
- int i;
- xmlNodeSetPtr nodesetp;
-
- if (NULL == (nodesetp = xpathobjp->nodesetval)) {
- xmlXPathFreeObject (xpathobjp);
- xmlXPathFreeContext(ctxp);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for (i = 0; i < nodesetp->nodeNr; i++) {
- xmlNodePtr node = nodesetp->nodeTab[i];
- zval *child;
- MAKE_STD_ZVAL(child);
-
- child = php_dom_create_object(node, &ret, NULL, child, intern TSRMLS_CC);
- add_next_index_zval(return_value, child);
- }
- }
+ array_init(return_value);
+ elemp = xmlDocGetRootElement(docp);
- xmlXPathFreeObject(xpathobjp);
- xmlXPathFreeContext(ctxp);
+ dom_get_elements_by_tag_name_ns_raw(elemp, NULL, name, &return_value, intern TSRMLS_CC);
}
/* }}} end dom_document_get_elements_by_tag_name */
@@ -1256,11 +1220,7 @@ char *_dom_get_valid_file_path(char *source, char *resolved_path, int resolved_p
xmlFreeURI(uri);
- if ((PG(safe_mode) && (!php_checkuid(file_dest, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(file_dest TSRMLS_CC)) {
- return NULL;
- } else {
- return file_dest;
- }
+ return file_dest;
}
@@ -1299,11 +1259,16 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC)
if (file_dest) {
ctxt = xmlCreateFileParserCtxt(file_dest);
}
+
} else {
ctxt = xmlCreateDocParserCtxt(source);
}
xmlKeepBlanksDefault(keep_blanks);
+ /* xmlIndentTreeOutput default is changed in xmlKeepBlanksDefault
+ reset back to 1 which is default value */
+
+ xmlIndentTreeOutput = 1;
if (ctxt == NULL) {
return(NULL);
@@ -1446,10 +1411,6 @@ PHP_FUNCTION(dom_document_save)
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
return;
}
-
- if ((PG(safe_mode) && (!php_checkuid(file, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(file TSRMLS_CC)) {
- RETURN_FALSE;
- }
/* encoding handled by property on doc */
@@ -1539,7 +1500,7 @@ PHP_FUNCTION(dom_document_validate)
cvp.userData = NULL;
cvp.error = (xmlValidityErrorFunc) php_dom_validate_error;
- cvp.warning = NULL;
+ cvp.warning = (xmlValidityErrorFunc) php_dom_validate_error;
if (xmlValidateDocument(&cvp, docp)) {
RETVAL_TRUE;
@@ -1735,9 +1696,6 @@ static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode)
}
if (mode == DOM_LOAD_FILE) {
- if ((PG(safe_mode) && (!php_checkuid(source, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(source TSRMLS_CC)) {
- RETURN_FALSE;
- }
newdoc = htmlParseFile(source, NULL);
} else {
newdoc = htmlParseDoc(source, NULL);
@@ -1808,10 +1766,6 @@ PHP_FUNCTION(dom_document_save_html_file)
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
return;
}
-
- if ((PG(safe_mode) && (!php_checkuid(file, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(file TSRMLS_CC)) {
- RETURN_FALSE;
- }
/* encoding handled by property on doc */
diff --git a/ext/dom/dom_ce.h b/ext/dom/dom_ce.h
index 4dcca6ce7f..2d279e89d3 100644
--- a/ext/dom/dom_ce.h
+++ b/ext/dom/dom_ce.h
@@ -53,5 +53,6 @@ zend_class_entry *dom_string_extend_class_entry;
#if defined(LIBXML_XPATH_ENABLED)
zend_class_entry *dom_xpath_class_entry;
#endif
+zend_class_entry *dom_namespace_node_class_entry;
#endif /* DOM_CE_H */
diff --git a/ext/dom/element.c b/ext/dom/element.c
index 0a70b50bbb..8e36486807 100644
--- a/ext/dom/element.c
+++ b/ext/dom/element.c
@@ -392,60 +392,21 @@ Since:
PHP_FUNCTION(dom_element_get_elements_by_tag_name)
{
zval *id;
- xmlXPathContextPtr ctxp;
- xmlNodePtr nodep;
- xmlDocPtr docp;
- xmlXPathObjectPtr xpathobjp;
- int name_len, ret;
+ xmlNodePtr elemp;
+ int name_len;
dom_object *intern;
- char *str,*name;
+ char *name;
- DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
+ DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr, intern);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
return;
}
- docp = nodep->doc;
-
- ctxp = xmlXPathNewContext(docp);
-
- ctxp->node = nodep;
- str = (char*) safe_emalloc((name_len+13), sizeof(char), 0) ;
- sprintf(str ,"descendant::%s",name);
-
- xpathobjp = xmlXPathEval(str, ctxp);
- efree(str);
- ctxp->node = NULL;
-
- if (!xpathobjp) {
- RETURN_FALSE;
- }
-
- if (xpathobjp->type == XPATH_NODESET) {
- int i;
- xmlNodeSetPtr nodesetp;
-
- if (NULL == (nodesetp = xpathobjp->nodesetval)) {
- xmlXPathFreeObject (xpathobjp);
- xmlXPathFreeContext(ctxp);
- RETURN_FALSE;
- }
-
- array_init(return_value);
-
- for (i = 0; i < nodesetp->nodeNr; i++) {
- xmlNodePtr node = nodesetp->nodeTab[i];
- zval *child;
- MAKE_STD_ZVAL(child);
-
- child = php_dom_create_object(node, &ret, NULL, child, intern TSRMLS_CC);
- add_next_index_zval(return_value, child);
- }
- }
+ array_init(return_value);
+ elemp = elemp->children;
- xmlXPathFreeObject(xpathobjp);
- xmlXPathFreeContext(ctxp);
+ dom_get_elements_by_tag_name_ns_raw(elemp, NULL, name, &return_value, intern TSRMLS_CC);
}
/* }}} end dom_element_get_elements_by_tag_name */
@@ -496,15 +457,15 @@ Since: DOM Level 2
*/
PHP_FUNCTION(dom_element_set_attribute_ns)
{
- zval *id, *rv = NULL;
+ zval *id;
xmlNodePtr elemp, nodep = NULL;
xmlNsPtr nsptr;
xmlAttr *attr;
- int ret, uri_len = 0, name_len = 0, value_len = 0;
+ int uri_len = 0, name_len = 0, value_len = 0;
char *uri, *name, *value;
char *localname = NULL, *prefix = NULL;
dom_object *intern;
- int errorcode = 0, stricterror;
+ int errorcode = 0, stricterror, is_xmlns = 0;
DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr, intern);
@@ -516,7 +477,7 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
if (dom_node_is_read_only(elemp) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
- RETURN_FALSE;
+ RETURN_NULL();
}
errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
@@ -527,19 +488,37 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
if (nodep != NULL) {
node_list_unlink(nodep->children TSRMLS_CC);
}
- nsptr = xmlSearchNsByHref(elemp->doc, elemp, uri);
- while (nsptr && nsptr->prefix == NULL) {
- nsptr = nsptr->next;
+
+ if (xmlStrEqual(prefix,"xmlns") && xmlStrEqual(uri, DOM_XMLNS_NAMESPACE)) {
+ is_xmlns = 1;
+ nsptr = dom_get_nsdecl(elemp, localname);
+ } else {
+ nsptr = xmlSearchNsByHref(elemp->doc, elemp, uri);
+ while (nsptr && nsptr->prefix == NULL) {
+ nsptr = nsptr->next;
+ }
}
+
if (nsptr == NULL) {
if (prefix == NULL) {
errorcode = NAMESPACE_ERR;
} else {
- nsptr = dom_get_ns(elemp, uri, &errorcode, prefix);
+ if (is_xmlns == 1) {
+ xmlNewNs(elemp, value, localname);
+ } else {
+ nsptr = dom_get_ns(elemp, uri, &errorcode, prefix);
+ }
+ }
+ } else {
+ if (is_xmlns == 1) {
+ if (nsptr->href) {
+ xmlFree((xmlChar *) nsptr->href);
+ }
+ nsptr->href = xmlStrdup(value);
}
}
- if (errorcode == 0) {
+ if (errorcode == 0 && is_xmlns == 0) {
attr = xmlSetNsProp(elemp, nsptr, localname, value);
}
} else {
@@ -558,14 +537,9 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
if (errorcode != 0) {
php_dom_throw_error(errorcode, stricterror TSRMLS_CC);
- RETURN_FALSE;
}
- if (nodep == NULL) {
- RETURN_FALSE;
- }
-
- DOM_RET_OBJ(rv, nodep, &ret, intern);
+ RETURN_NULL();
}
/* }}} end dom_element_set_attribute_ns */
@@ -579,6 +553,7 @@ PHP_FUNCTION(dom_element_remove_attribute_ns)
zval *id;
xmlNode *nodep;
xmlAttr *attrp;
+ xmlNsPtr nsptr;
dom_object *intern;
int name_len, uri_len;
char *name, *uri;
@@ -591,17 +566,28 @@ PHP_FUNCTION(dom_element_remove_attribute_ns)
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
- RETURN_FALSE;
+ RETURN_NULL();
}
- if (xmlStrEqual(uri, DOM_XMLNS_NAMESPACE)) {
- DOM_NOT_IMPLEMENTED();
- } else {
- attrp = xmlHasNsProp(nodep, name, uri);
- if (attrp == NULL) {
- RETURN_FALSE;
+ attrp = xmlHasNsProp(nodep, name, uri);
+
+ nsptr = dom_get_nsdecl(nodep, name);
+ if (nsptr != NULL) {
+ if (xmlStrEqual(uri, nsptr->href)) {
+ if (nsptr->href != NULL) {
+ xmlFree((char *) nsptr->href);
+ nsptr->href = NULL;
+ }
+ if (nsptr->prefix != NULL) {
+ xmlFree((char *) nsptr->prefix);
+ nsptr->prefix = NULL;
+ }
+ } else {
+ RETURN_NULL();
}
+ }
+ if (attrp) {
if (dom_object_get_data((xmlNodePtr) attrp) == NULL) {
node_list_unlink(attrp->children TSRMLS_CC);
xmlUnlinkNode((xmlNodePtr) attrp);
@@ -611,7 +597,7 @@ PHP_FUNCTION(dom_element_remove_attribute_ns)
}
}
- RETURN_TRUE;
+ RETURN_NULL();
}
/* }}} end dom_element_remove_attribute_ns */
@@ -622,12 +608,12 @@ Since: DOM Level 2
*/
PHP_FUNCTION(dom_element_get_attribute_node_ns)
{
- zval *id;
+ zval *id, *rv = NULL;
xmlNodePtr elemp;
- xmlNs *nsp;
+ xmlAttrPtr attrp;
dom_object *intern;
- int uri_len, name_len;
- char *uri, *name, *value;
+ int uri_len, name_len, ret;
+ char *uri, *name;
DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr, intern);
@@ -635,24 +621,14 @@ PHP_FUNCTION(dom_element_get_attribute_node_ns)
return;
}
- value = xmlGetNsProp(elemp, name, uri);
+ attrp = xmlHasNsProp(elemp, name, uri);
- if (value != NULL) {
- RETVAL_STRING(value, 1);
- xmlFree(value);
- } else {
- if (xmlStrEqual(name, DOM_XMLNS_NAMESPACE)) {
- nsp = dom_get_nsdecl(elemp, name);
- if (nsp != NULL) {
- RETVAL_STRING((char *) nsp->href, 1);
- } else {
- RETVAL_EMPTY_STRING();
- }
- } else {
- RETVAL_EMPTY_STRING();
- }
+ if (attrp == NULL) {
+ RETURN_NULL();
}
+ DOM_RET_OBJ(rv, (xmlNodePtr) attrp, &ret, intern);
+
}
/* }}} end dom_element_get_attribute_node_ns */
diff --git a/ext/dom/node.c b/ext/dom/node.c
index d8a487247d..483c88dc57 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -84,6 +84,17 @@ int dom_node_node_name_read(dom_object *obj, zval **retval TSRMLS_DC)
str = (char *) nodep->name;
}
break;
+ case XML_NAMESPACE_DECL:
+ ns = nodep->ns;
+ if (ns != NULL && ns->prefix) {
+ qname = xmlStrdup("xmlns");
+ qname = xmlStrcat(qname, ":");
+ qname = xmlStrcat(qname, nodep->name);
+ str = qname;
+ } else {
+ str = (char *) nodep->name;
+ }
+ break;
case XML_DOCUMENT_TYPE_NODE:
case XML_DTD_NODE:
case XML_PI_NODE:
@@ -108,11 +119,6 @@ int dom_node_node_name_read(dom_object *obj, zval **retval TSRMLS_DC)
case XML_TEXT_NODE:
str = "#text";
break;
- case XML_NAMESPACE_DECL:
- if (nodep->ns != NULL) {
- str = (char *) nodep->ns->prefix;
- }
- break;
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Node Type");
return FAILURE;
@@ -160,6 +166,9 @@ currently here as a convience method while developing */
case XML_PI_NODE:
str = xmlNodeGetContent(nodep);
break;
+ case XML_NAMESPACE_DECL:
+ str = xmlNodeGetContent(nodep->children);
+ break;
default:
str = NULL;
break;
@@ -519,6 +528,7 @@ int dom_node_namespace_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
switch (nodep->type) {
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
+ case XML_NAMESPACE_DECL:
if (nodep->ns != NULL) {
str = (char *) nodep->ns->href;
}
@@ -559,6 +569,7 @@ int dom_node_prefix_read(dom_object *obj, zval **retval TSRMLS_DC)
switch (nodep->type) {
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
+ case XML_NAMESPACE_DECL:
ns = nodep->ns;
if (ns != NULL && ns->prefix) {
str = (char *) ns->prefix;
@@ -650,7 +661,7 @@ int dom_node_local_name_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
- if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) {
+ if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE || nodep->type == XML_NAMESPACE_DECL) {
ZVAL_STRING(*retval, (char *) (nodep->name), 1);
} else {
ZVAL_NULL(*retval);
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index eb39de3bb2..159cb804c0 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -58,6 +58,7 @@ static HashTable dom_documenttype_prop_handlers;
static HashTable dom_notation_prop_handlers;
static HashTable dom_entity_prop_handlers;
static HashTable dom_processinginstruction_prop_handlers;
+static HashTable dom_namespace_node_prop_handlers;
#if defined(LIBXML_XPATH_ENABLED)
static HashTable dom_xpath_prop_handlers;
#endif
@@ -485,6 +486,19 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_node_prop_handlers, "textContent", dom_node_text_content_read, dom_node_text_content_write TSRMLS_CC);
zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_node_prop_handlers, sizeof(dom_node_prop_handlers), NULL);
+ REGISTER_DOM_CLASS(ce, "domnamespacenode", NULL, NULL, dom_namespace_node_class_entry);
+
+ zend_hash_init(&dom_namespace_node_prop_handlers, 0, NULL, NULL, 1);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "nodeName", dom_node_node_name_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "nodeValue", dom_node_node_value_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "nodeType", dom_node_node_type_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "prefix", dom_node_prefix_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "localName", dom_node_local_name_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "namespaceURI", dom_node_namespace_uri_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "ownerDocument", dom_node_owner_document_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_namespace_node_prop_handlers, "parentNode", dom_node_parent_node_read, NULL TSRMLS_CC);
+ zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_namespace_node_prop_handlers, sizeof(dom_namespace_node_prop_handlers), NULL);
+
REGISTER_DOM_CLASS(ce, "domdocumentfragment", dom_node_class_entry, php_dom_documentfragment_class_functions, dom_documentfragment_class_entry);
zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_node_prop_handlers, sizeof(dom_node_prop_handlers), NULL);
@@ -742,6 +756,7 @@ PHP_MSHUTDOWN_FUNCTION(dom)
zend_hash_destroy(&dom_domimplementationlist_prop_handlers);
zend_hash_destroy(&dom_document_prop_handlers);
zend_hash_destroy(&dom_node_prop_handlers);
+ zend_hash_destroy(&dom_namespace_node_prop_handlers);
zend_hash_destroy(&dom_nodelist_prop_handlers);
zend_hash_destroy(&dom_namednodemap_prop_handlers);
zend_hash_destroy(&dom_characterdata_prop_handlers);
@@ -815,8 +830,6 @@ void dom_node_free(xmlNodePtr node)
case XML_ENTITY_DECL:
case XML_ELEMENT_DECL:
case XML_ATTRIBUTE_DECL:
- case XML_NAMESPACE_DECL:
- /* These can never stand alone */
break;
case XML_NOTATION_NODE:
/* These require special handling */
@@ -831,6 +844,12 @@ void dom_node_free(xmlNodePtr node)
}
xmlFree(node);
break;
+ case XML_NAMESPACE_DECL:
+ if (node->ns) {
+ xmlFreeNs(node->ns);
+ node->ns = NULL;
+ }
+ node->type = XML_ELEMENT_NODE;
default:
xmlFreeNode(node);
}
@@ -859,6 +878,7 @@ void node_free_list(xmlNodePtr node TSRMLS_DC)
case XML_DOCUMENT_TYPE_NODE:
case XML_ENTITY_DECL:
case XML_ATTRIBUTE_NODE:
+ case XML_NAMESPACE_DECL:
node_free_list(node->children TSRMLS_CC);
break;
default:
@@ -889,7 +909,7 @@ void node_free_resource(xmlNodePtr node TSRMLS_DC)
case XML_HTML_DOCUMENT_NODE:
break;
default:
- if (node->parent == NULL) {
+ if (node->parent == NULL || node->type == XML_NAMESPACE_DECL) {
node_free_list((xmlNodePtr) node->children TSRMLS_CC);
switch (node->type) {
/* Skip property freeing for the following types */
@@ -898,6 +918,7 @@ void node_free_resource(xmlNodePtr node TSRMLS_DC)
case XML_DOCUMENT_TYPE_NODE:
case XML_ENTITY_DECL:
case XML_ATTRIBUTE_NODE:
+ case XML_NAMESPACE_DECL:
break;
default:
node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
@@ -1118,6 +1139,11 @@ zval *php_dom_create_object(xmlNodePtr obj, int *found, zval *wrapper_in, zval *
ce = dom_notation_class_entry;
break;
}
+ case XML_NAMESPACE_DECL:
+ {
+ ce = dom_namespace_node_class_entry;
+ break;
+ }
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported node type: %d\n", Z_TYPE_P(obj));
ZVAL_NULL(wrapper);
@@ -1183,17 +1209,13 @@ int dom_has_feature(char *feature, char *version)
/* {{{ void dom_element_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval TSRMLS_DC) */
void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval, dom_object *intern TSRMLS_DC)
{
- dom_object *wrapper;
int ret;
while (nodep != NULL) {
if (nodep->type == XML_ELEMENT_NODE && xmlStrEqual(nodep->name, local)) {
if (ns == NULL || (nodep->ns != NULL && xmlStrEqual(nodep->ns->href, ns))) {
- zval *child = NULL;
- wrapper = dom_object_get_data(nodep);
- if (wrapper == NULL) {
- MAKE_STD_ZVAL(child);
- }
+ zval *child;
+ MAKE_STD_ZVAL(child);
child = php_dom_create_object(nodep, &ret, NULL, child, intern TSRMLS_CC);
add_next_index_zval(*retval, child);
@@ -1328,7 +1350,7 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
if (localName == NULL || xmlStrEqual(localName, "")) {
cur = node->nsDef;
while (cur != NULL) {
- if (cur->prefix == NULL) {
+ if (cur->prefix == NULL && cur->href != NULL) {
ret = cur;
break;
}
diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c
index e1503c5cff..cc9e8f3600 100644
--- a/ext/dom/xpath.c
+++ b/ext/dom/xpath.c
@@ -214,8 +214,27 @@ PHP_FUNCTION(dom_xpath_query)
for (i = 0; i < nodesetp->nodeNr; i++) {
xmlNodePtr node = nodesetp->nodeTab[i];
zval *child;
- MAKE_STD_ZVAL(child);
+ MAKE_STD_ZVAL(child);
+
+ if (node->type == XML_NAMESPACE_DECL) {
+ xmlNsPtr curns;
+ xmlNodePtr nsparent;
+
+ nsparent = node->_private;
+ curns = xmlNewNs(NULL, node->name, NULL);
+ if (node->children) {
+ curns->prefix = xmlStrdup((char *) node->children);
+ }
+ if (node->children) {
+ node = xmlNewDocNode(docp, NULL, (char *) node->children, node->name);
+ } else {
+ node = xmlNewDocNode(docp, NULL, "xmlns", node->name);
+ }
+ node->type = XML_NAMESPACE_DECL;
+ node->parent = nsparent;
+ node->ns = curns;
+ }
child = php_dom_create_object(node, &ret, NULL, child, intern TSRMLS_CC);
add_next_index_zval(return_value, child);
}