summaryrefslogtreecommitdiff
path: root/ext/domxml/php_domxml.c
diff options
context:
space:
mode:
authorChristian Stocker <chregu@php.net>2002-08-14 14:23:44 +0000
committerChristian Stocker <chregu@php.net>2002-08-14 14:23:44 +0000
commit63874f901762030a5b6048930ba70da56161c291 (patch)
treebb128360e75db98b381bd0565c37f17a520ed636 /ext/domxml/php_domxml.c
parent6be8fb6a2ea3cfa8a6fbf721ce319260b0392510 (diff)
downloadphp-git-63874f901762030a5b6048930ba70da56161c291.tar.gz
@ - Added some namespace support with DomNode->add_namespace(uri, prefix)
@ and DomDocument->create_element_ns(uri, nodename) (chregu)
Diffstat (limited to 'ext/domxml/php_domxml.c')
-rw-r--r--ext/domxml/php_domxml.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c
index e8f85004d6..f8c4c7508a 100644
--- a/ext/domxml/php_domxml.c
+++ b/ext/domxml/php_domxml.c
@@ -232,6 +232,7 @@ static zend_function_entry domxml_functions[] = {
PHP_FE(domxml_node_unlink_node, NULL)
PHP_FE(domxml_node_set_content, NULL)
PHP_FE(domxml_node_get_content, NULL)
+ PHP_FE(domxml_node_add_namespace, NULL)
PHP_FE(domxml_new_xmldoc, NULL)
PHP_FALIAS(domxml_new_doc, domxml_new_xmldoc, NULL)
PHP_FE(domxml_parser, NULL)
@@ -295,6 +296,7 @@ static function_entry php_domxmldoc_class_functions[] = {
PHP_FALIAS(implementation, domxml_doc_implementation, NULL)
PHP_FALIAS(document_element, domxml_doc_document_element, NULL)
PHP_FALIAS(create_element, domxml_doc_create_element, NULL)
+ PHP_FALIAS(create_element_ns, domxml_doc_create_element_ns, NULL)
PHP_FALIAS(create_text_node, domxml_doc_create_text_node, NULL)
PHP_FALIAS(create_comment, domxml_doc_create_comment, NULL)
PHP_FALIAS(create_attribute, domxml_doc_create_attribute, NULL)
@@ -392,6 +394,7 @@ static zend_function_entry php_domxmlnode_class_functions[] = {
PHP_FALIAS(namespace_uri, domxml_node_namespace_uri, NULL)
PHP_FALIAS(clone_node, domxml_clone_node, NULL)
/* Non DOM functions start here */
+ PHP_FALIAS(add_namespace, domxml_node_add_namespace, NULL)
PHP_FALIAS(add_child, domxml_node_append_child, NULL)
PHP_FALIAS(append_sibling, domxml_node_append_sibling, NULL)
PHP_FALIAS(node, domxml_node, NULL)
@@ -2374,6 +2377,11 @@ PHP_FUNCTION(domxml_node_append_child)
RETURN_FALSE;
}
+ /* copy namespace if one is there */
+ if (child->ns) {
+ new_child->ns = child->ns;
+ }
+
/* FIXME reverted xmlAddChildList; crashes
* Uwe: must have been a temporary problem. It works for me with both
* xmlAddChildList and xmlAddChild
@@ -3285,6 +3293,69 @@ PHP_FUNCTION(domxml_doc_create_element)
}
/* }}} */
+/* {{{ proto object domxml_doc_create_element_ns(string uri, string name)
+ Creates new element node with a namespace*/
+PHP_FUNCTION(domxml_doc_create_element_ns)
+{
+ zval *id, *rv = NULL;
+ xmlNode *node;
+ xmlNs *nsptr;
+ xmlDocPtr docp = NULL;
+ int ret, name_len, uri_len;
+ char *name, *uri;
+
+ DOMXML_PARAM_FOUR(docp, id, le_domxmldocp, "ss", &uri, &uri_len, &name, &name_len);
+
+ nsptr = xmlSearchNsByHref(docp, xmlDocGetRootElement(docp), (xmlChar*) uri);
+ node = xmlNewNode(nsptr, name);
+
+ if (!node) {
+ RETURN_FALSE;
+ }
+ /* if no namespace with the same uri was found, we have to create a new one.
+ I do this here with a + the adress of the node. this is not very sophisticated,
+ therefore if someone has a better idea in creating unique prefixes, here's your
+ chance (a0,a1, etc would be good enough, this is the way mozilla does it). I'm
+ to lazy right now to think of a better solution... */
+
+ if (nsptr == NULL) {
+ char prefix[20];
+ sprintf(prefix, "a%d",node);
+ nsptr = xmlNewNs(node, uri, prefix);
+ xmlSetNs(node, nsptr);
+ }
+
+ node->doc = docp;
+
+ if(DOMXML_IS_TYPE(getThis(), domxmlelement_class_entry)) {
+ DOMXML_DOMOBJ_NEW(getThis(), node, &ret);
+ } else {
+ DOMXML_RET_OBJ(rv, node, &ret);
+ }
+}
+/* }}} */
+
+/* {{{ proto object domxml_node_add_namespace(string uri, string prefix)
+ Adds a namespace declaration to a node */
+PHP_FUNCTION(domxml_node_add_namespace)
+{
+ zval *id;
+ xmlNode *nodep;
+ xmlNs *nsptr;
+ int prefix_len, uri_len;
+ char *prefix, *uri;
+
+ DOMXML_PARAM_FOUR(nodep, id, le_domxmldocp, "ss", &uri, &uri_len, &prefix, &prefix_len);
+
+ if (NULL == (nsptr = xmlNewNs(nodep,uri,prefix))) {
+ RETURN_FALSE;
+ } else {
+ RETURN_TRUE;
+ }
+
+}
+/* }}} */
+
/* {{{ proto object domxml_doc_create_text_node(string content)
Creates new text node */
PHP_FUNCTION(domxml_doc_create_text_node)