libxml2使用(libxml-2.0)

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 stdio h



 1 /**  2  *练习libxml库,创建通讯录xml文档,新增一个通讯录,  3  *如果xml文件存在,则添加一个新节点  4  *如果xml文件不存在,则新建一个xml文件  5  *  6  *@author: Anker @date: 2014/02/09  7  * */  8  9 #include 
  
    
     
      10 #include < 
     string.h> 
      11 #include 
      
       12 #include 
       
        13 
        14 #include 
        
         15 #include 
         
          16 #include 
          
           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)分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2026-03-25 23:27
下一篇 2026-03-25 23:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/58356.html