/** * Create XML document * @param soap SOAP handler * @param rootNsUri Root Namespace URI * @param rootName Root node name * @return XML document */ WsXmlDocH ws_xml_create_doc( const char *rootNsUri, const char *rootName) { WsXmlDocH wsDoc = (WsXmlDocH) u_zalloc(sizeof(*wsDoc)); WsXmlNodeH rootNode; WsXmlNsH ns; char prefix[12]; if (wsDoc == NULL) { error("No memory"); return NULL; } if (!xml_parser_create_doc(wsDoc, rootName) ) { error("xml_parser_create_doc failed"); u_free(wsDoc); return NULL; } if (rootNsUri == NULL) { return wsDoc; } rootNode = ws_xml_get_doc_root((WsXmlDocH) wsDoc); ws_xml_make_default_prefix(rootNode, rootNsUri, prefix, sizeof(prefix)); ns = xml_parser_ns_add(rootNode, rootNsUri, prefix); if (ns == NULL) { error("xml_parser_ns_add failed"); ws_xml_destroy_doc(wsDoc); return NULL; } ws_xml_set_node_name(rootNode, rootNsUri, NULL); return wsDoc; }
WsXmlNsH xml_parser_ns_find(WsXmlNodeH node, const char *uri, const char *prefix, int bWalkUpTree, int bAddAtRootIfNotFound) { xmlNodePtr xmlNode = (xmlNodePtr) node; xmlNsPtr xmlNs = NULL; while (xmlNode != NULL) { xmlNs = xmlNode->nsDef; while (xmlNs != NULL) { if (uri) { if (!strcmp((char *) xmlNs->href, uri)) break; } else if (prefix == NULL) { if (xmlNs->prefix == NULL) break; } else if (xmlNs->prefix && !strcmp((char *) xmlNs->prefix, prefix)) { break; } xmlNs = xmlNs->next; } if (xmlNs != NULL || !bWalkUpTree) break; xmlNode = xmlNode->parent; } if (xmlNs == NULL && bAddAtRootIfNotFound) { xmlNodePtr xmlRoot = xmlDocGetRootElement(((xmlDocPtr) node)->doc); char buf[12]; if (prefix == NULL) { ws_xml_make_default_prefix((WsXmlNodeH) xmlRoot, uri, buf, sizeof(buf)); prefix = buf; } xmlNs = (xmlNsPtr) xml_parser_ns_add((WsXmlNodeH) xmlRoot, uri, prefix); } return (WsXmlNsH) xmlNs; }
/** * Define Namespace * @param node XML node * @param nsUri Namespace URI * @param nsPrefix Namespace Prefix * @param bDefault FIXME * @return New Namespace * @todo if ns is present, it should work as replace, walk through the tree and * update QName values and attributes */ WsXmlNsH ws_xml_define_ns(WsXmlNodeH node, const char *nsUri, const char *nsPrefix, int bDefault) { WsXmlNsH ns = NULL; if (node && nsUri) { ns = ws_xml_find_ns(node, nsUri, NULL, 0); if (ns == NULL || !is_ns_prefix_ok(ns, nsPrefix, bDefault)) { char buf[12]; if (!bDefault && nsPrefix == NULL) { ws_xml_make_default_prefix(node, nsUri, buf, sizeof(buf)); nsPrefix = buf; } ns = xml_parser_ns_add(node, nsUri, nsPrefix); } } return ns; }
WsXmlNsH ws_xml_ns_add(WsXmlNodeH node, const char *uri, const char *prefix) { return xml_parser_ns_add(node, uri, prefix); }