C語言是一種能夠?qū)崿F(xiàn)底層編程的編程語言,它可以運用在很多領(lǐng)域,其中也包括數(shù)據(jù)格式轉(zhuǎn)換。XML和JSON是兩種常見的數(shù)據(jù)格式,目前許多應(yīng)用程序中又需要將XML文件轉(zhuǎn)換為JSON格式。下面我們就來介紹如何使用C語言實現(xiàn)XML到JSON的轉(zhuǎn)換。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <libxml/parser.h> #include <libxml/tree.h> #include <jansson.h> void parse_element(json_t* json, xmlNode* node); void parse_attributes(json_t* json, xmlNode* node) { xmlAttr* attribute; for(attribute = node->properties; attribute; attribute = attribute->next) { json_object_set(json, (const char*)attribute->name, json_string((const char*)xmlGetProp(node, attribute->name))); } } void parse_element(json_t* json, xmlNode* node) { json_t* child_json; for(xmlNode* current_child = node->children; current_child; current_child = current_child->next) { if(current_child->type == XML_TEXT_NODE) { char* content = (char*)xmlNodeGetContent(current_child); if(strspn(content, " \t\n\v\f\r") != strlen(content)) //跳過空格和換行 { json_object_set(json, "content", json_string(content)); } xmlFree(content); } else if(current_child->type == XML_ELEMENT_NODE) { char* tag = (char*)current_child->name; child_json = json_object(); parse_attributes(child_json, current_child); parse_element(child_json, current_child); json_object_set(json, tag, child_json); } } } int main(int argc, const char* argv[]) { xmlDoc* document = xmlReadFile("test.xml", NULL, 0); json_t* root_json = json_object(); xmlNode* root = xmlDocGetRootElement(document); parse_element(root_json, root); char* json_str = json_dumps(root_json, JSON_PRESERVE_ORDER | JSON_INDENT(2)); printf("%s", json_str); free(json_str); xmlFreeDoc(document); xmlCleanupParser(); return 0; }
上面的代碼可以將XML文件解析為一個JSON對象,并輸出為字符串形式,可以方便地在其他應(yīng)用程序中使用。其中,parse_attributes函數(shù)用于解析節(jié)點的屬性,parse_element函數(shù)用于遞歸解析節(jié)點和子節(jié)點。
需要注意的是,這只是一個簡單的XML轉(zhuǎn)JSON的例子,實際上,XML的復(fù)雜性往往不在節(jié)點本身,而是在其嵌套和屬性上。在實際應(yīng)用中,應(yīng)該根據(jù)XML文件的結(jié)構(gòu)和數(shù)據(jù)類型,修改相應(yīng)的解析函數(shù)以達到更好的效果。