diff options
| author | Rob Richards <rrichards@php.net> | 2003-07-27 17:57:06 +0000 |
|---|---|---|
| committer | Rob Richards <rrichards@php.net> | 2003-07-27 17:57:06 +0000 |
| commit | 43bc2f0b6dcb1af71b2a7770b0c6eb98617c4a89 (patch) | |
| tree | 7e448e9ef526a841ab0f1db017a233c3c6028030 /ext/dom/node.c | |
| parent | b156ac970315428dbbd817af8828b51bd0e273ce (diff) | |
| download | php-git-43bc2f0b6dcb1af71b2a7770b0c6eb98617c4a89.tar.gz | |
reworking xml namespace support
add node lookupNamespaceURI and lookupPrefix
add attr isId
Diffstat (limited to 'ext/dom/node.c')
| -rw-r--r-- | ext/dom/node.c | 142 |
1 files changed, 104 insertions, 38 deletions
diff --git a/ext/dom/node.c b/ext/dom/node.c index 2faedfee80..951a75c97f 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -543,10 +543,8 @@ int dom_node_prefix_read(dom_object *obj, zval **retval TSRMLS_DC) case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: ns = nodep->ns; - if (ns != NULL) { - if (ns->prefix) { - str = (char *) ns->prefix; - } + if (ns != NULL && ns->prefix) { + str = (char *) ns->prefix; } break; default: @@ -578,42 +576,40 @@ int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC) switch (nodep->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: - ns = nodep->ns; - strURI = NULL; - if (nodep->ns != NULL) { - strURI = (char *) nodep->ns->href; - } prefix = Z_STRVAL_P(newval); - if (strURI == NULL || - (!strcmp (prefix, "xml") && strcmp(strURI, XML_XML_NAMESPACE)) || - (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (prefix, "xmlns") && - strcmp (strURI, DOM_XMLNS_NAMESPACE)) || - (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) { - - /* TODO: throw error - find out how to without a return_value - php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC); */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); - return FAILURE; - } - ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar *)prefix); - if (nodep->doc != NULL) { - doc = nodep->doc; - if (doc->oldNs == NULL) { - doc->oldNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - memset(doc->oldNs, 0, sizeof(xmlNs)); - doc->oldNs->type = XML_LOCAL_NAMESPACE; - doc->oldNs->href = xmlStrdup(XML_XML_NAMESPACE); - doc->oldNs->prefix = xmlStrdup((const xmlChar *)"xml"); + if (nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) { + strURI = (char *) nodep->ns->href; + if (strURI == NULL || + (!strcmp (prefix, "xml") && strcmp(strURI, XML_XML_NAMESPACE)) || + (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (prefix, "xmlns") && + strcmp (strURI, DOM_XMLNS_NAMESPACE)) || + (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) { + + /* TODO: throw error - find out how to without a return_value + php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC); */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace"); + return FAILURE; } - - curns = doc->oldNs; - while (curns->next != NULL) { - curns = curns->next; + ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar *)prefix); + if (nodep->doc != NULL) { + doc = nodep->doc; + if (doc->oldNs == NULL) { + doc->oldNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + memset(doc->oldNs, 0, sizeof(xmlNs)); + doc->oldNs->type = XML_LOCAL_NAMESPACE; + doc->oldNs->href = xmlStrdup(XML_XML_NAMESPACE); + doc->oldNs->prefix = xmlStrdup((const xmlChar *)"xml"); + } + + curns = doc->oldNs; + while (curns->next != NULL) { + curns = curns->next; + } + curns->next = ns; } - curns->next = ns; - } - nodep->ns = curns; + nodep->ns = curns; + } break; default: break; @@ -1002,6 +998,7 @@ PHP_FUNCTION(dom_node_append_child) zval *id, *node, *rv = NULL; xmlNodePtr child, nodep, new_child = NULL; dom_object *intern, *childobj; + xmlNsPtr nsptr; int ret; DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern); @@ -1089,6 +1086,15 @@ PHP_FUNCTION(dom_node_append_child) RETURN_FALSE; } + if (new_child->nsDef != NULL && new_child->type == XML_ELEMENT_NODE && new_child->nsDef->href != NULL) { + if((nsptr = xmlSearchNsByHref(nodep->doc, new_child->parent, new_child->nsDef->href)) && + (new_child->nsDef->prefix == NULL || xmlStrEqual(nsptr->prefix, new_child->nsDef->prefix))) { + dom_set_old_ns(nodep->doc, new_child->ns); + new_child->nsDef = NULL; + new_child->ns = nsptr; + } + } + DOM_RET_OBJ(rv, new_child, &ret, intern); } /* }}} end dom_node_append_child */ @@ -1263,7 +1269,47 @@ Since: DOM Level 3 */ PHP_FUNCTION(dom_node_lookup_prefix) { - DOM_NOT_IMPLEMENTED(); + zval *id; + xmlNodePtr nodep, lookupp = NULL; + dom_object *intern; + xmlNsPtr nsptr; + int uri_len = 0; + char *uri; + + DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &uri, &uri_len) == FAILURE) { + return; + } + + if (uri_len > 0) { + switch (nodep->type) { + case XML_ELEMENT_NODE: + lookupp = nodep; + break; + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + lookupp = xmlDocGetRootElement((xmlDocPtr) nodep); + break; + case XML_ENTITY_NODE : + case XML_NOTATION_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DTD_NODE: + RETURN_NULL(); + break; + default: + lookupp = nodep->parent; + } + + if (lookupp != NULL && (nsptr = xmlSearchNsByHref(lookupp->doc, lookupp, uri))) { + if (nsptr->prefix != NULL) { + RETURN_STRING((char *) nsptr->prefix, 1); + } + } + } + + RETURN_NULL(); } /* }}} end dom_node_lookup_prefix */ @@ -1285,7 +1331,27 @@ Since: DOM Level 3 */ PHP_FUNCTION(dom_node_lookup_namespace_uri) { - DOM_NOT_IMPLEMENTED(); + zval *id; + xmlNodePtr nodep; + dom_object *intern; + xmlNsPtr nsptr; + int prefix_len = 0; + char *prefix; + + DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &prefix, &prefix_len) == FAILURE) { + return; + } + + if (prefix_len > 0) { + nsptr = xmlSearchNs(nodep->doc, nodep, prefix); + if (nsptr && nsptr->href != NULL) { + RETURN_STRING((char *) nsptr->href, 1); + } + } + + RETURN_NULL(); } /* }}} end dom_node_lookup_namespace_uri */ |
