計算機系統中的數據交換一般會采用特定的數據格式,常見的格式有 JSON 和 XML,它們是數據交換的重要標準格式,支持多種編程語言,非常方便。在 C 語言中,我們有很多解析 JSON 和 XML 的工具,下面簡單介紹兩個常用的解析器。
JSON 解析器
#include <stdio.h> #include <jansson.h> int main() { char *json_string = "{\"name\":\"小明\",\"age\":25,\"skill\":[\"C++\",\"Python\"]}"; json_t *root = NULL; json_error_t error; root = json_loads(json_string, 0, &error); if (!json_is_object(root)) { printf("Error: parse json string failed\n"); return -1; } json_t *name = json_object_get(root, "name"); printf("Name: %s\n", json_string_value(name)); json_t *age = json_object_get(root, "age"); printf("Age: %d\n", json_integer_value(age)); json_t *skill = json_object_get(root, "skill"); if (json_is_array(skill)) { size_t i; printf("Skill:"); for (i = 0; i< json_array_size(skill); i++) { json_t *item = json_array_get(skill, i); printf(" %s", json_string_value(item)); } printf("\n"); } json_decref(root); return 0; }
json-c 是一個解析 JSON 格式的開源庫,其 API 簡單易用,使用方便。在代碼中,我們先定義了一個 JSON 格式的字符串json_string
,然后通過調用 json_loads() 函數將字符串轉化為 json 對象,然后通過 json_object_get() 函數獲取對象中的屬性值,最后調用 json_decref() 函數釋放 json 對象。
XML 解析器
#include <stdio.h> #include <libxml/parser.h> static void parse_person(xmlNodePtr node) { xmlNodePtr cur = NULL; for (cur = node; cur != NULL; cur = cur->next) { if (cur->type == XML_ELEMENT_NODE) { if (xmlStrcmp(cur->name, (const xmlChar *)"name") == 0) { printf("Name: %s\n", xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1)); } if (xmlStrcmp(cur->name, (const xmlChar *)"age") == 0) { printf("Age: %s\n", xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1)); } if (xmlStrcmp(cur->name, (const xmlChar *)"skill") == 0) { xmlNodePtr skill = NULL; for (skill = cur->children; skill != NULL; skill = skill->next) { if (skill->type == XML_ELEMENT_NODE) { printf("Skill: %s\n",xmlNodeListGetString(skill->doc, skill->xmlChildrenNode, 1)); } } } } parse_person(cur->children); } } int main() { xmlDocPtr doc; xmlNodePtr root_element = NULL; doc = xmlReadFile("person.xml", NULL, 0); if (doc == NULL) { printf("Error: parse xml file failed\n"); return -1; } root_element = xmlDocGetRootElement(doc); if (root_element == NULL) { printf("Error: get xml root element failed\n"); xmlFreeDoc(doc); return -1; } if (xmlStrcmp(root_element->name, (const xmlChar *) "person")) { printf("Error: xml root element error\n"); xmlFreeDoc(doc); return -1; } parse_person(root_element); xmlFreeDoc(doc); return 0; }
libxml2 是一個用 C 語言編寫的開源 XML 庫,支持解析和生成 XML 格式的文檔。在代碼中,我們通過調用 xmlReadFile() 函數讀取本地的 person.xml 文件,然后獲取 root 節點,調用 parse_person() 函數遍歷 XML 文檔中的元素,最終釋放內存。
上一篇gson讀取json數據
下一篇html字體怎么設置好看