Rob Richards wrote:

> From: Christian Stocker
> 
>> > $node->setAttributeNS("http://www.w3.org/2000/xmlns/";, "xmlns:b",
>> > "http://www.somedomain.de/";);
>> >
> 
>> IMHO, that would be very confusing.
>>
>> I liked the idea by vivian with a third optional namespaceURI argument
>> for the element object, so that at least you can use your own extended
>> classes for that.
>>
>> And maybe we still need a ->setNamespaceURI method, even if W3C didnt
>> think of that ;)
> 
> After thinking about it some more I started to think about it the same
> way. One can always then use $node->prefix = "xyz" to set the prefix (if
> needed) for the initial namespace delcaration.
> It probably has to wait until 5.1 though since its so close to the
> release.
> 
> Rob

first of all, thanks for your interests...
i tried my self in extending your code - i'm really no C programmer, just
copy&pasted it (poor to say that, sorry:), but it seems to work.

i now can use the following syntax to set the namespaceUri of a node:

<?php
        $element = new DomElement("tagname", "value", "http://namespaceUri";);
        // or
        $element = new DomElement("pref:tagname", "value", "http://namespaceUri";);
        // works as well
?>

here is the diff output:

--- ./element_original.c        2004-02-15 15:08:52.000000000 +0100
+++ ./element.c 2004-02-17 20:53:35.000000000 +0100
@@ -64,11 +64,14 @@
 
        zval *id;
        xmlNodePtr nodep = NULL, oldnode = NULL;
+       xmlNsPtr nsptr = NULL;
        dom_object *intern;
-       char *name, *value = NULL;
-       int name_len, value_len = 0;
+       char *name, *value = NULL, *uri = NULL;
+       char *localname = NULL, *prefix = NULL;
+       int name_len, value_len = 0, uri_len = 0;
+       int errorcode;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
"Os|s", &id, dom_element_class_entry, &name, &name_len, &value, &value_len)
== FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
"Os|ss", &id, dom_element_class_entry, &name, &name_len, &value,
&value_len, &uri, &uri_len) == FAILURE) {
                return;
        }
 
@@ -77,15 +80,49 @@
                RETURN_FALSE;
        }
 
-       nodep = xmlNewNode(NULL, (xmlChar *) name);
+       //
+
+       errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
+
+       if (errorcode == 0) {
+               nodep = xmlNewNode(NULL, (xmlChar *) localname);
+
+               if (!nodep)
+                       RETURN_FALSE;
+
+               if (value_len > 0) {
+                       xmlNodeSetContentLen(nodep, value, value_len);
+               }
+               // nodep = xmlNewDocNode (docp, NULL, localname, NULL);
+               if (nodep != NULL && uri != NULL) {
+                       nsptr = xmlSearchNsByHref (nodep->doc, nodep, uri);
+                       if (nsptr == NULL) {
+                               nsptr = dom_get_ns(nodep, uri, &errorcode, prefix);
+                       }
+                       xmlSetNs(nodep, nsptr);
+               }
+       }
 
-       if (!nodep)
+       xmlFree(localname);
+       if (prefix != NULL) {
+               xmlFree(prefix);
+       }
+
+       if (errorcode != 0) {
+               if (nodep != NULL) {
+                       xmlFreeNode(nodep);
+               }
+               php_dom_throw_error(errorcode, dom_get_strict_error(intern->document)
TSRMLS_CC);
                RETURN_FALSE;
+       }
 
-       if (value_len > 0) {
-               xmlNodeSetContentLen(nodep, value, value_len);
+       if (nodep == NULL) {
+               RETURN_FALSE;
        }
 
+
+       nodep->ns = nsptr;
+       //
        intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern != NULL) {
                oldnode = (xmlNodePtr)intern->ptr;
@@ -97,8 +134,8 @@
 }
 /* }}} end dom_element_element */
 
-/* {{{ proto tagName   string  
-readonly=yes 
+/* {{{ proto tagName   string
+readonly=yes
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226
DOM3-Core.html#core-ID-104682815
 Since: 
 */


as you said it's close to the release and i won't bring you into trouble,
but maybe you can take a short time to look if i had made some heavy
errors...

MANY MANY THANKS in advance,
best regards

vivian

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to