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);
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 */
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;
}
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);
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 */
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;
}
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);
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 */
#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 */
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 */
*/
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);
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);
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 {
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 */
zval *id;
xmlNode *nodep;
xmlAttr *attrp;
+ xmlNsPtr nsptr;
dom_object *intern;
int name_len, uri_len;
char *name, *uri;
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);
}
}
- RETURN_TRUE;
+ RETURN_NULL();
}
/* }}} end dom_element_remove_attribute_ns */
*/
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);
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 */
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:
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;
case XML_PI_NODE:
str = xmlNodeGetContent(nodep);
break;
+ case XML_NAMESPACE_DECL:
+ str = xmlNodeGetContent(nodep->children);
+ break;
default:
str = NULL;
break;
switch (nodep->type) {
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
+ case XML_NAMESPACE_DECL:
if (nodep->ns != NULL) {
str = (char *) nodep->ns->href;
}
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;
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);
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
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);
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);
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 */
}
xmlFree(node);
break;
+ case XML_NAMESPACE_DECL:
+ if (node->ns) {
+ xmlFreeNs(node->ns);
+ node->ns = NULL;
+ }
+ node->type = XML_ELEMENT_NODE;
default:
xmlFreeNode(node);
}
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:
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 */
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);
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);
/* {{{ 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);
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;
}
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);
}