Linux C編程第二十章XML-JSON

      網友投稿 1206 2025-04-01

      一、XML

      1.?minixml官網地址

      http://www.msweet.org/projects.php/Mini-XML

      其他解析xml開源庫:tinyxml pugixml

      1)包含頭文件: mxml.h

      2)編譯的時候需要添加動態庫: libmxml.so

      -lmxml

      /usr/local/lib

      2. minixml安裝:

      ./configure --enable-threads=no && make

      sudo make install

      3. 新目錄需要一個文件頭 - 標準

      version不可以省略

      encoding可以省略

      4. 使用注意事項

      必須有一個根元素(節點) -- (只有一個)

      xml標簽對大小寫敏感

      標簽大多成對使用, 有開始, 有結束

      5. 標簽中可以添加屬性

      屬性值必須加引號

      6. 標簽注釋

      【Linux C編程】第二十章XML-JSON

      7. 開源庫minixml的使用

      (1)跟標簽的對應的節點,父親節點是:文件頭節點

      (2)生成xml文件

      1)創建一個新的xml文件

      mxml_node_t *mxmlNewXML(const char *version);

      返回新創建的xml文件節點.

      默認的文件的編碼為utf8

      2)刪除節點的內存

      void mxmlDelete(mxml_node_t *node);

      3)添加一個新的節點

      mxml_node_t *mxmlNewElement( mxml_node_t *parent, // 父節點 const char *name // 新節點標簽名 );

      4)設置節點的屬性名和屬性值

      void mxmlElementSetAttr( mxml_node_t *node, // 被設置屬性的節點 const char *name, // 節點的屬性名 const char *value // 屬性值 );

      5)創建節點的文本內容

      mxml_node_t *mxmlNewText ( mxml_node_t *parent, // 節點地址 int whitespace, // 是否有空白 0 const char *string // 文本內容 );

      6)保存節點到xml文件

      int mxmlSaveFile( mxml_node_t *node, // 根節點 FILE *fp, // 文件指針 mxml_save_cb_t cb // 默認MXML_NO_CALLBACK );

      (3)解析xml文件

      1)從文件加載xml到內存

      mxml_node_t *mxmlLoadFile( mxml_node_t *top, // 一般為NULL FILE *fp, // 文件指針 mxml_type_t (*cb)(mxml_node_t *) // 默認 MXML_NO_CALLBACK );

      2)獲取節點的屬性

      const char *mxmlElementGetAttr( mxml_node_t *node, // 帶屬性的節點的地址 const char *name // 屬性名 );

      3)獲取指定節點的文本內容

      const char *mxmlGetText( mxml_node_t *node, // 節點的地址 int *whitespace // 是否有空格 );

      4)跳轉到下一個節點

      mxml_node_t *mxmlWalkNext( mxml_node_t *node, // 當前節點 mxml_node_t *top, // 根節點 int descend ); descend:搜索的規則 MXML_NO_DESCEND:查看同層級 MXML_DESCEND_FIRST:查看下一層級的第一個 MXML_DESCEND:一直向下搜索

      5)查找節點

      mxml_node_t *mxmlFindElement( mxml_node_t *node, // 當前節點 mxml_node_t *top, // 根節點 const char *name, // 查找的標簽名 const char *attr, // 查找的標簽的屬性,沒有屬性傳NULL const char *value, // 查找的標簽的屬性值,沒有屬性傳NULL int descend // 同上 );

      8. 示例

      (1)生成下面的xml

      create_xml.xml

      1 2 3 4 哈利波特 5 JK.Rowling 6 2005 7 29.99 8 9

      create.c

      parsexml.c

      1 #include 2 #include "mxml.h" 3 4 int main(int argc, const char* argv[]) 5 { 6 // 加載xml文件 7 FILE* fp = fopen("book.xml", "r"); 8 mxml_node_t* root = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); 9 10 // 查找book節點 11 mxml_node_t* book = mxmlFindElement(root, root, "book", "category", NULL, MXML_DESCEND); 12 printf("book attr: %s\n", mxmlElementGetAttr(book, "category")); 13 14 mxml_node_t* node = mxmlWalkNext(book, root, MXML_DESCEND_FIRST); 15 printf(" title: %s\n", mxmlGetText(node, 0)); 16 17 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 18 printf(" author: %s\n", mxmlGetText(node, 0)); 19 20 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 21 printf(" year: %s\n", mxmlGetText(node, 0)); 22 23 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 24 printf(" price: %s\n", mxmlGetText(node, 0)); 25 26 fclose(fp); 27 28 mxmlDelete(root); 29 30 return 0; 31 }

      (2)生成下面的xml

      create_xml.xml

      1 2 3 4 北京 5 1.641萬平方千米 6 2200萬 7 8 9 石家莊 10 15848平方千米 11 107萬 12 13

      create.c

      1 #include 2 #include 3 4 int main(int argc, const char* argv[]) 5 { 6 // 創建xml文件頭節點 7 mxml_node_t *xml = mxmlNewXML("1.0"); 8 9 // 創建xml根節點 - china 10 mxml_node_t* china = mxmlNewElement(xml, "China"); 11 12 13 // 創建城市節點 14 mxml_node_t* city = mxmlNewElement(china, "City"); 15 // 添加子節點 16 // name 17 mxml_node_t* name = mxmlNewElement(city, "Name"); 18 // 設置標簽值 19 mxmlNewText(name, 0, "北京"); 20 mxmlElementSetAttr(name, "isbig", "true"); 21 // 面積 22 mxml_node_t* area = mxmlNewElement(city, "Area"); 23 mxmlNewText(area, 0, "1.641萬平方千米"); 24 // 人口 25 mxml_node_t* popu = mxmlNewElement(city, "Population"); 26 mxmlNewText(popu, 0, "2200萬"); 27 28 // 第二個城市節點 29 city = mxmlNewElement(china, "City"); 30 // name 31 name = mxmlNewElement(city, "Name"); 32 mxmlNewText(name, 0, "石家莊"); 33 mxmlElementSetAttr(name, "isbig", "false"); 34 area = mxmlNewElement(city, "Area"); 35 mxmlNewText(area, 0, "15848平方千米"); 36 popu = mxmlNewElement(city, "Population"); 37 mxmlNewText(popu, 0, "107萬"); 38 39 // 將xml內容保存到磁盤 40 FILE* fp = fopen("china.xml", "w"); 41 mxmlSaveFile(xml, fp, MXML_NO_CALLBACK); 42 fclose(fp); 43 mxmlDelete(xml); 44 45 return 0; 46 }

      parse_xml.c

      1 #include 2 #include 3 4 int main(int argc, const char* argv[]) 5 { 6 // 從磁盤加載xml文件 7 FILE* fp = fopen("china.xml", "r"); 8 if(fp == NULL) 9 { 10 printf("fopen error\n"); 11 return 0; 12 } 13 // root 節點指向xml文件頭 14 mxml_node_t* root = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); 15 16 // 遍歷 - 取出各個節點的值 17 // 找到第一個城市節點 18 mxml_node_t* city = mxmlFindElement(root, root, "City", NULL, NULL, MXML_DESCEND); 19 if(city == NULL) 20 { 21 printf("xml node not found\n"); 22 return 0; 23 } 24 while( city ) 25 { 26 printf("==================\n"); 27 // 向下走一個節點 28 mxml_node_t* node = mxmlWalkNext(city, root, MXML_DESCEND_FIRST); 29 printf("city: \n"); 30 printf(" name = %s\n", mxmlGetText(node, NULL)); 31 // 32 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 33 printf(" area = %s\n", mxmlGetText(node, NULL)); 34 // 35 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 36 printf(" population = %s\n", mxmlGetText(node, NULL)); 37 // 搜索下一個城市節點 38 city = mxmlFindElement(city, root, "City", NULL, NULL, MXML_DESCEND); 39 } 40 41 fclose(fp); 42 mxmlDelete(root); 43 44 return 0; 45 }

      (3)xml 解析注意問題

      注意:使用 minixml 開源庫生成的 xml 會在一行,如果手動將調整 xml,則解析會有問題。下面的示例相同的xml,只是將在一行的xml進行調整,注意運行查看解析結果。

      car1.xml

      1 2 3 4 一汽大眾 5 6 高爾夫 7 紅色 8 15萬 9 10 11 速騰 12 銀白 13 18萬 14 15 16 邁騰 17 黑灰 18 28萬 19 20 21 22 23 帕薩特 24 黑色 25 25萬 26 27 28 POLO 29 灰色 30 8萬 31 32 33

      car2.xml

      1 高爾夫紅色15萬速騰銀白18萬邁騰黑灰28萬帕薩特黑色25萬POLO灰色8萬

      parsecar.c

      1 #include 2 #include "mxml.h" 3 4 int main(int argc, const char* argv[]) 5 { 6 if(argc < 2) 7 { 8 printf("./a.out filename\n"); 9 return 0; 10 } 11 // 加載xml文件 12 FILE* fp = fopen(argv[1], "r"); 13 mxml_node_t* root = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); 14 15 // 找到第一個factory節點 16 mxml_node_t* factory = mxmlFindElement(root, root, "factory", "name", NULL, MXML_DESCEND); 17 // 循環查找 18 while( factory ) 19 { 20 // 打印幾點的屬性值 21 printf("factory attr: %s\n", mxmlElementGetAttr(factory, "name")); 22 23 // 向下移動一個節點 24 mxml_node_t* brand = mxmlWalkNext(factory, root, MXML_DESCEND); 25 while( brand ) 26 { 27 // name 28 mxml_node_t* node = mxmlWalkNext(brand, root, MXML_DESCEND_FIRST); 29 printf(" name: %s\n", mxmlGetText(node, 0)); 30 // color 31 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 32 printf(" color: %s\n", mxmlGetText(node, 0)); 33 // price 34 node = mxmlWalkNext(node, root, MXML_NO_DESCEND); 35 printf(" price: %s\n", mxmlGetText(node, 0)); 36 printf(" =========================================\n"); 37 38 // 找到下一個品牌節點 39 brand = mxmlFindElement(brand, root, "brand", NULL, NULL, MXML_NO_DESCEND); 40 } 41 // 打印該廠家對應的車輛品牌和屬性信息 42 // 查找下一個節點 43 factory = mxmlFindElement(factory, root, "factory", "name", NULL, MXML_NO_DESCEND); 44 } 45 mxmlDelete(root); 46 fclose(fp); 47 48 return 0; 49 }

      上面代碼編譯:gcc c文件 -lmxml -lpthread

      二、JSON

      1. cjson的使用

      壓縮包解壓縮,直接使用里邊的cJSON.c和cJSON.h即可

      鏈接時還需要加上-lm 表示鏈接math庫

      2. json數組

      char array[23] = "slkjflajslfd";

      中括號[整形, 字符串, 布爾類型, json數組, json對象],比如[123, 123.2, true, false, [12, 34, 56, "hello, world"]]

      3. json對象

      {}中是一些鍵值對

      { "name":"zhang3", "name2":"li4" } key值: 必須是 字符串, 不重復 value值: json對象, json數組, 布爾, 整形, 字符串

      4.?json數組+json對象

      { "name":"zhang3", "name2":"li4", "張三":{ "別名":"老王", "性別":"男", "年齡":34, "孩子":["小紅", "小綠", "小黑"] } }

      5.?C語言json開源解析庫 - cjson

      (1)生成json文件

      1)創建一個json對象

      cJSON *cJSON_CreateObject(void);

      2) 往json對象中添加數據成員

      void cJSON_AddItemToObject( cJSON *object, // json對象 const char *string, // key值 cJSON *item // value值(int,string,array,obj) );

      3)創建一個整型值

      cJSON *cJSON_CreateNumber(double num);

      4)創建一個字符串

      cJSON *cJSON_CreateString(const char *string);

      5)創建一個json數組

      cJSON *cJSON_CreateArray(void); -- 空數組

      6)創建默認有count個整形值的json數組

      cJSON *cJSON_CreateIntArray(const int *numbers,int count);

      int arry[] = {8,3,4,5,6};

      cJSON_CreateIntArray(arry, 5);

      7)往json數組中添加數據成員

      void cJSON_AddItemToArray(cJSON *array, cJSON *item);

      8)釋放jSON結構指針

      void cJSON_Delete(cJSON *c)

      9)將JSON結構轉化為字符串

      char *cJSON_Print(cJSON *item);

      返回值需要使用free釋放

      FILE* fp = fopen();

      fwrite();

      fclose();

      (2)解析json文件

      1)將字符串解析為JSON結構

      cJSON *cJSON_Parse(const char *value);

      注意:返回值需要使用cJSON_Delete釋放

      2)根據鍵值查找json節點

      cJSON *cJSON_GetObjectItem( cJSON *object, // 當前json對象 const char *string // key值 );

      3)獲取json數組中元素的個數

      int cJSON_GetArraySize(cJSON *array);

      4) 根據數組下標找到對應的數組元素

      cJSON *cJSON_GetArrayItem(cJSON *array, int index);

      5)判斷是否有可以值對應的鍵值對

      int cJSON_HasObjectItem(cJSON *object, const char *string);

      示例:

      JSON Linux XML

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:共享excel工作簿的教程
      下一篇:wps表格怎樣使用自動分頁符(wps表格 分頁符)
      相關文章
      久久久无码精品亚洲日韩京东传媒| 亚洲欧洲专线一区| 亚洲中文字幕无码中文字| 亚洲欧洲第一a在线观看| 亚洲日韩精品无码专区网址| 亚洲伊人久久综合中文成人网| 久久水蜜桃亚洲AV无码精品| 亚洲大尺度无码无码专线一区| 亚洲一级片在线观看| 亚洲老熟女@TubeumTV| 久久久久亚洲AV片无码下载蜜桃| 亚洲av无码一区二区三区乱子伦| 亚洲日本va在线视频观看| 亚洲精品色婷婷在线影院| 亚洲日本一区二区三区在线不卡| 亚洲第一区精品日韩在线播放| 亚洲AV无码一区二区大桥未久| 亚洲精品国产精品| 亚洲风情亚Aⅴ在线发布| 亚洲乱码国产乱码精华| 亚洲日韩国产AV无码无码精品| 亚洲日韩精品A∨片无码加勒比| 亚洲一本一道一区二区三区| 亚洲日本天堂在线| 亚洲av无码有乱码在线观看| 色噜噜噜噜亚洲第一| 亚洲精品成人片在线观看| av在线亚洲欧洲日产一区二区| 久久综合亚洲色HEZYO国产| 亚洲精品无码不卡在线播HE| 亚洲乱码国产乱码精品精| 亚洲成色WWW久久网站| 亚洲国产精品lv| 亚洲精品国产免费| 在线综合亚洲中文精品| 亚洲成在人线aⅴ免费毛片| 亚洲av无码成人精品区| 国产AV无码专区亚洲AV漫画| 亚洲区小说区激情区图片区| 亚洲av不卡一区二区三区| 亚洲色偷偷av男人的天堂|