]> granicus.if.org Git - php/commitdiff
implement namespace nodes
authorRob Richards <rrichards@php.net>
Mon, 20 Oct 2003 15:50:34 +0000 (15:50 +0000)
committerRob Richards <rrichards@php.net>
Mon, 20 Oct 2003 15:50:34 +0000 (15:50 +0000)
fix getElementsByTagName
fixes to attribute namespaces
remove safemode stuff as its handled in streams

ext/dom/document.c
ext/dom/dom_ce.h
ext/dom/element.c
ext/dom/node.c
ext/dom/php_dom.c
ext/dom/xpath.c

index 90c6e5bad356cfda07149209259e10baa52e26f4..4982a6b7e8f501081ec1de5c45b8437373109bfa 100644 (file)
@@ -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 */
 
index 4dcca6ce7fc22e80d8a0d20469e9d43cbfd0c3b9..2d279e89d367935522efc6c19ba8d71a1f6afe63 100644 (file)
@@ -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 */
index 0a70b50bbb481383c8c33f138b09bef5c2b11fdd..8e36486807d919efd2248c862ad8c7d892fa5c34 100644 (file)
@@ -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 */
 
index d8a487247d439f273c1c1c483a864cd1d6966ee2..483c88dc57391b9fd0c489e2d1ed4b7ce27c4736 100644 (file)
@@ -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);
index eb39de3bb2e87eb12e15cff9f2d0756dc06f40a9..159cb804c0c51a130f8587fd4fdc078a92516374 100644 (file)
@@ -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;
                        }
index e1503c5cff0c08533ca3cb8f14a863f1de94df8b..cc9e8f3600533c62f22244f05ebd2eae163d53f2 100644 (file)
@@ -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);
                }