char *cg_xml_node_getchildnodevalue(CgXmlNode *node, char *name) { CgXmlNode *childNode; cg_log_debug_l4("Entering...\n"); childNode = cg_xml_node_getchildnode(node, name); if (childNode != NULL) return cg_xml_node_getvalue(childNode); cg_log_debug_l4("Leaving...\n"); return NULL; }
void cg_xml_node_setchildnode(CgXmlNode *node, char *name, char *value) { CgXmlNode *childNode; cg_log_debug_l4("Entering...\n"); childNode = cg_xml_node_getchildnode(node, name); if (childNode != NULL) { cg_xml_node_setvalue(childNode, value); return; } childNode = cg_xml_node_new(); cg_xml_node_setname(childNode, name); cg_xml_node_setvalue(childNode, value); cg_xml_node_addchildnode(node, childNode); cg_log_debug_l4("Leaving...\n"); }
CgXmlNode *cg_soap_request_getbodynode(CgSoapRequest *soapReq) { CgXmlNode *envNode; CgXmlNode *bodyNode = NULL; CgXmlAttribute *attr; char *name; CgStringTokenizer *tok; char *nsPrefix; size_t bodyLen; char *body; cg_log_debug_l4("Entering...\n"); envNode = cg_soap_request_getenvelopenode(soapReq); if (envNode == NULL) return NULL; if (cg_xml_node_haschildnodes(envNode) == FALSE) return NULL; /* We cannot assume the namespace prefix for Body is 's'. According to spec, it could be anything... */ for (attr = cg_xml_node_getattributes(envNode); attr != NULL; attr = cg_xml_attribute_next(attr)) { /* First, find the namespace declaration attribute. */ /* Note: We must take a copy of the attr name. Tokenizer doesn't do it (by default) */ name = cg_strdup( cg_xml_attribute_getname(attr) ); tok = cg_string_tokenizer_new(name, ":"); nsPrefix = cg_string_tokenizer_nexttoken(tok); if ( -1 != cg_strstr(nsPrefix, "xmlns")) { /* This attribute is a namespace declaration. Check is it the one defined for SOAP. */ if (cg_strcmp(cg_xml_attribute_getvalue(attr), CG_SOAP_XMLNS_URL) == 0) { /* This namespace declaration is correct. Use it to find the body node... */ if (cg_string_tokenizer_hasmoretoken(tok)) { /* There is a prefix */ nsPrefix = cg_string_tokenizer_nexttoken(tok); bodyLen = cg_strlen(nsPrefix) + cg_strlen(CG_SOAP_DELIM) + cg_strlen(CG_SOAP_BODY) + 1; /* +1 for trailing '\0'*/ body = (char*)malloc(bodyLen); if ( NULL == body ) { cg_log_debug_s("Memory allocation failure!\n"); return NULL; } #if defined(HAVE_SNPRINTF) snprintf(body, bodyLen, "%s%s%s", nsPrefix, CG_SOAP_DELIM, CG_SOAP_BODY); #else sprintf(body, "%s%s%s", nsPrefix, CG_SOAP_DELIM, CG_SOAP_BODY); #endif bodyNode = cg_xml_node_getchildnode(envNode, body); free(body); } else { /* No prefix */ bodyNode = cg_xml_node_getchildnode(envNode, CG_SOAP_BODY); } /* Free memory before leaving the loop */ cg_string_tokenizer_delete(tok); free(name); break; } } cg_string_tokenizer_delete(tok); free(name); } cg_log_debug_l4("Leaving...\n"); return bodyNode; }
CgXmlNode *cg_xml_node_getchildnodewithnamespace(CgXmlNode *node, char *name, char *ns, BOOL ignoreNs) { char *nameWithPrefix = NULL; int nameLen = 0; int nameIdx; CgXmlNode *result = NULL; CgXmlNode *child = NULL; char *nodeName = NULL; cg_log_debug_l4("Entering...\n"); if (node == NULL) return NULL; if (name == NULL) return NULL; if (ignoreNs == TRUE) { for (child = cg_xml_node_getchildnodelist(node); child != NULL; child = cg_xml_node_next(child)) { nodeName = cg_xml_node_getname(child); if (nodeName == NULL) continue; nameIdx = cg_strstr(nodeName, ":"); if (nameIdx < 0) { /* No prefix (no ':') */ if (cg_strcasecmp(nodeName, name) == 0) return child; } else { if (cg_strcasecmp(&(nodeName[nameIdx+1]), name) == 0) return child; } } return NULL; } else { if (ns == NULL) { /* When ns is NULL, this works like normal ..._getchildnode */ return cg_xml_node_getchildnode(node, name); } nameLen = cg_strlen(name) + cg_strlen(ns) + 1; /* Not including the terminating \0 */ nameWithPrefix = (char*) malloc(nameLen + 1); if (nameWithPrefix == NULL) return NULL; #if defined(HAVE_SNPRINTF) snprintf(nameWithPrefix, nameLen + 1, "%s:%s", ns, name); #else sprintf(nameWithPrefix, "%s:%s", ns, name); #endif result = cg_xml_node_getchildnode(node, nameWithPrefix); free(nameWithPrefix); return result; } cg_log_debug_l4("Leaving...\n"); }