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)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qdvuejs/23207.html