JSON和XML是兩種常見的數(shù)據(jù)交換格式,它們在不同的應(yīng)用場景中發(fā)揮著重要的作用。在一些需要將JSON數(shù)據(jù)轉(zhuǎn)換為XML格式的應(yīng)用中,我們可以使用C語言中的第三方庫進(jìn)行轉(zhuǎn)換。
#include <stdio.h> #include <cJSON.h> #include <libxml/parser.h> #include <libxml/tree.h> xmlNodePtr cJSON_to_xml(cJSON *root) { xmlNodePtr node = NULL; switch (root->type) { case cJSON_Object: { node = xmlNewNode(NULL, BAD_CAST "object"); cJSON *child = root->child; while (child) { xmlNodePtr child_node = cJSON_to_xml(child); xmlAddChild(node, child_node); child = child->next; } break; } case cJSON_Array: { node = xmlNewNode(NULL, BAD_CAST "array"); cJSON *child = root->child; while (child) { xmlNodePtr child_node = cJSON_to_xml(child); xmlAddChild(node, child_node); child = child->next; } break; } case cJSON_Number: { node = xmlNewNode(NULL, BAD_CAST "number"); char str[32]; snprintf(str, 32, "%f", root->valuedouble); xmlNodeSetContent(node, BAD_CAST str); break; } case cJSON_String: { node = xmlNewNode(NULL, BAD_CAST "string"); xmlNodeSetContent(node, BAD_CAST root->valuestring); break; } case cJSON_True: case cJSON_False: { node = xmlNewNode(NULL, BAD_CAST "boolean"); xmlNodeSetContent(node, BAD_CAST (root->type == cJSON_True) ? "true" : "false"); break; } default: break; } return node; } int main(int argc, char **argv) { char *json_str = "{\"name\":\"張三\",\"age\":18,\"gender\":\"男\(zhòng)",\"hobbies\":[\"籃球\",\"游戲\"]}"; cJSON *root = cJSON_Parse(json_str); if (root) { xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr root_node = cJSON_to_xml(root); xmlDocSetRootElement(doc, root_node); xmlSaveFormatFileEnc("output.xml", doc, "UTF-8", 1); xmlFreeDoc(doc); } cJSON_Delete(root); return 0; }
上述代碼使用了兩個第三方庫,cJSON和libxml。首先解析JSON字符串,獲取根節(jié)點后,通過遞歸方式將JSON對象和數(shù)組轉(zhuǎn)換為XML節(jié)點。XML結(jié)果保存到內(nèi)存中,最后通過xmlSaveFormatFileEnc函數(shù)保存到文件中。
以上是一個簡單的C語言JSON轉(zhuǎn)XML的實例。你可以根據(jù)需要擴(kuò)展該代碼,完成更復(fù)雜的JSON格式轉(zhuǎn)換工作。