当前位置:网站首页 > Vue.js开发 > 正文

libxml2使用(libxml-2.0)



 1 /**  2  *练习libxml库,创建通讯录xml文档,新增一个通讯录,  3  *如果xml文件存在,则添加一个新节点  4  *如果xml文件不存在,则新建一个xml文件  5  *  6  *@author: Anker @date: 2014/02/09  7  * */  8  9 #include <stdio.h>  10 #include <string.h>  11 #include <unistd.h>  12 #include <assert.h>  13  14 #include <libxml/parser.h>  15 #include <libxml/tree.h>  16 #include <libxml/xmlmemory.h>  17  18 #define PHONE_BOOK_FILE "phone_book.xml"  19 #define ID_STR_LEN 16  20 #define NAME_STR_LEN 32  21 #define TEL_STR_LEN 16  22 #define ADDR_STR_LEN 128  23  24 //电话通讯录结构体  25 typedef struct phone_t {  26 int id; //编号  27 char name[NAME_STR_LEN]; //姓名  28 char tel[TEL_STR_LEN]; //电话  29 char address[ADDR_STR_LEN]; //地址  30 }phone;  31  32 //设置通讯录项  33 static void set_phone_item(phone *phone_item)  34 {  35  assert(phone_item);  36  37 phone_item->id = 10;  38 snprintf(phone_item->name, NAME_STR_LEN, "%s", "Anker");  39 snprintf(phone_item->tel, TEL_STR_LEN, "%s", "");  40 snprintf(phone_item->address, ADDR_STR_LEN, "%s", "Shenzheng");  41 }  42  43 //创建phone节点  44 static xmlNodePtr create_phone_node(const phone *phone_item)  45 {  46  assert(phone_item);  47  48 char id[ID_STR_LEN] = {0};  49 xmlNodePtr phone_node = NULL;  50  51 phone_node = xmlNewNode(NULL, BAD_CAST"phone");  52 if (phone_node == NULL) {  53 fprintf(stderr, "Failed to create new node. ");  54 return NULL;  55  }  56 //设置属性  57 snprintf(id, ID_STR_LEN, "%d", phone_item->id);  58 xmlNewProp(phone_node, BAD_CAST"id", (xmlChar*)id);  59  60 xmlNewChild(phone_node, NULL, BAD_CAST"name", (xmlChar *)phone_item->name);  61 xmlNewChild(phone_node, NULL, BAD_CAST"tel", (xmlChar *)phone_item->tel);  62 xmlNewChild(phone_node, NULL, BAD_CAST"address", (xmlChar *)phone_item->address);  63  64 return phone_node;  65 }  66  67 //向根节点中添加一个phone节点  68 static int add_phone_node_to_root(xmlNodePtr root_node)  69 {  70 xmlNodePtr phone_node = NULL;  71 phone *phone_item = NULL;  72  73 //创建一个新的phone  74 phone_item = (phone *)malloc(sizeof(phone));  75 if (phone_item == NULL) {  76 fprintf(stderr, "Failed to malloc memory. ");  77 return -1;  78  }  79  set_phone_item(phone_item);  80  81 //创建一个phone节点  82 phone_node = create_phone_node(phone_item);  83 if (phone_node == NULL) {  84 fprintf(stderr, "Failed to create phone node. ");  85 goto FAILED;  86  }  87 //根节点添加一个子节点  88  xmlAddChild(root_node, phone_node);  89  free(phone_item);  90  91 return 0;  92 FAILED:  93 if (phone_item){  94  free(phone_item);  95  }  96 return -1;  97 }  98  99 //创建phone_books 100 static int create_phone_books(const char *phone_book_file) 101 { 102  assert(phone_book_file); 103 104 xmlDocPtr doc = NULL; 105 xmlNodePtr root_node = NULL; 106 107 //创建一个xml 文档 108 doc = xmlNewDoc(BAD_CAST"1.0"); 109 if (doc == NULL) { 110 fprintf(stderr, "Failed to new doc. "); 111 return -1; 112  } 113 114 //创建根节点 115 root_node = xmlNewNode(NULL, BAD_CAST"phone_books"); 116 if (root_node == NULL) { 117 fprintf(stderr, "Failed to new root node. "); 118 goto FAILED; 119  } 120 //将根节点添加到文档中 121  xmlDocSetRootElement(doc, root_node); 122 123 if (add_phone_node_to_root(root_node) != 0) { 124 fprintf(stderr, "Failed to add a new phone node. "); 125 goto FAILED; 126  } 127 //将文档保存到文件中,按照utf-8编码格式保存 128 xmlSaveFormatFileEnc(phone_book_file, doc, "UTF-8", 1); 129 //xmlSaveFile("test.xml", doc); 130  xmlFreeDoc(doc); 131 132 return 0; 133 FAILED: 134 if (doc) { 135  xmlFreeDoc(doc); 136  } 137 138 return -1; 139 } 140 141 static int add_phone_node(const char *phone_book_file) 142 { 143  assert(phone_book_file); 144 145 xmlDocPtr doc = NULL; 146 xmlNodePtr root_node = NULL; 147 xmlNodePtr phone_node = NULL; 148 phone *phone_item = NULL; 149 150 doc = xmlParseFile(phone_book_file); 151 if (doc == NULL) { 152 fprintf(stderr, "Failed to parser xml file:%s ", phone_book_file); 153 return -1; 154  } 155 156 root_node = xmlDocGetRootElement(doc); 157 if (root_node == NULL) { 158 fprintf(stderr, "Failed to get root node. "); 159 goto FAILED; 160  } 161 162 if (add_phone_node_to_root(root_node) != 0) { 163 fprintf(stderr, "Failed to add a new phone node. "); 164 goto FAILED; 165  } 166 //将文档保存到文件中,按照utf-8编码格式保存 167 xmlSaveFormatFileEnc(phone_book_file, doc, "UTF-8", 1); 168  xmlFreeDoc(doc); 169 170 return 0; 171 FAILED: 172 if (doc) { 173  xmlFreeDoc(doc); 174  } 175 176 return -1; 177 } 178 179 int main(int argc, char *argv[]) 180 { 181 char *phone_book_file = PHONE_BOOK_FILE; 182 183 if (argc == 2) { 184 phone_book_file = argv[1]; 185  } 186 187 if (access(phone_book_file, F_OK) == 0) { 188 //文件存在,添加一个新的phone节点 189  add_phone_node(phone_book_file); 190  } 191 else { 192 //文件不存在,创建一个信息的phone book 193  create_phone_books(phone_book_file); 194  } 195 196 return 0; 197 }
到此这篇libxml2使用(libxml-2.0)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • vue安装脚手架命令(vue3.0脚手架安装)2025-07-31 14:45:09
  • vue3.0钩子函数(vue.js钩子函数)2025-07-31 14:45:09
  • tldraw vue(tldraw vue版本)2025-07-31 14:45:09
  • vue插槽使用(vue3.0 插槽)2025-07-31 14:45:09
  • vue路由守卫死循环(vue 路由死循环)2025-07-31 14:45:09
  • nvme2.0接口(nvme接口图)2025-07-31 14:45:09
  • pcie5.0显卡能插4.0主板吗(pcie4.0x4插显卡)2025-07-31 14:45:09
  • vue路由守卫有几种(vue3 路由守卫)2025-07-31 14:45:09
  • cjson库(cjson库下载)2025-07-31 14:45:09
  • stompjs文档(spreadjs中文文档)2025-07-31 14:45:09
  • 全屏图片