/** * Build an element with a namespace. * @param name Qualified element name. * @param uri URI of the namespace. */ void *Element::makeNS(String name, String uri) { int len; xmlNodePtr node = 0; const xmlChar *local_name = xmlSplitQName3(name, &len); if(!local_name) { node = xmlNewNode(NULL, name); NODE(node)->ns = xmlNewNs(node, uri, NULL); } else { node = xmlNewNode(NULL, local_name); char_t prefix[len + 1]; memcpy(prefix, &name, len); prefix[len] = '\0'; NODE(node)->ns = xmlNewNs(node, uri, prefix); } return node; }
int xmljMatchNS (const xmlChar * uri, const xmlChar * localName, xmlNodePtr node) { xmlNsPtr ns; const xmlChar *nodeLocalName; int *len; int ret; switch (node->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: len = (int *) malloc (sizeof (int)); if (xmlSplitQName3 (node->name, len) != NULL) { nodeLocalName = node->name + (*len); } else { nodeLocalName = node->name; } free (len); ns = node->ns; if (ns == NULL || ns->href == NULL) { if (uri != NULL) { return 0; } ret = xmlStrcmp (localName, nodeLocalName); } else { if (uri == NULL) { return 0; } ret = (xmlStrcmp (localName, nodeLocalName) && xmlStrcmp (uri, ns->href)); } return ret; default: return 1; } }
static xmlNodePtr dom_get_dom1_attribute(xmlNodePtr elem, xmlChar *name) /* {{{ */ { int len; const xmlChar *nqname; nqname = xmlSplitQName3(name, &len); if (nqname != NULL) { xmlNsPtr ns; xmlChar *prefix = xmlStrndup(name, len); if (prefix && xmlStrEqual(prefix, (xmlChar *)"xmlns")) { ns = elem->nsDef; while (ns) { if (xmlStrEqual(ns->prefix, nqname)) { break; } ns = ns->next; } xmlFree(prefix); return (xmlNodePtr)ns; } ns = xmlSearchNs(elem->doc, elem, prefix); if (prefix != NULL) { xmlFree(prefix); } if (ns != NULL) { return (xmlNodePtr)xmlHasNsProp(elem, nqname, ns->href); } } else { if (xmlStrEqual(name, (xmlChar *)"xmlns")) { xmlNsPtr nsPtr = elem->nsDef; while (nsPtr) { if (nsPtr->prefix == NULL) { return (xmlNodePtr)nsPtr; } nsPtr = nsPtr->next; } return NULL; } } return (xmlNodePtr)xmlHasNsProp(elem, name, NULL); }