libxml解析XML文档

目前三种最流行的开源 c/c++解析xml库:libxml、Xerces、expat ,且三者都是跨平台的。
 
Xerces-C++ (C++版本): http://xerces.apache.org/xerces-c/index.html 
xerces2-j (java版本): http://xerces.apache.org/xerces2-j/
java版dom及sax方式解析示例:


一、libxml库下载
 
 
二、libxml安装
 
#解压安装文件
[root@localhost xmllib]# tar -xzvf libxml2-git-snapshot.tar.gz
 
#然后cd进入解压后的目录,运行初始配置文件,也可使用 ./configure --prefix=$HOME/libxml 指定安装目录
#不指定安装目录,则默认安装在系统目录 /usr/local/include/libxml2
[root@localhost libxml2-2.8.0]# ./configure
 
#make编译
[root@localhost libxml2-2.8.0]# make
 
#make install安装
[root@localhost libxml2-2.8.0]# make install

注:libxml无论输入/输出,默认只支持UTF-8,如果需要输出GB2312或其他编码的内容,则需要iconv工具库来转码(如libiconv
(libiconv-1.11.tar.gz),安装与上同)
 
三、libxml示例
 
libxml 支持dom和sax方式解析,下面是从文档里抽取的一个示例(更多的实现,可参考API文档及sample文档):
 
1、story.xml

  1. <?xml version="1.0"?>
  2. <story>
  3.   <storyinfo>
  4.     <author>John Fleck</author>
  5.     <datewritten>June 2, 2002</datewritten>
  6.     <keyword>example keyword</keyword>
  7.   </storyinfo>
  8.   <body>
  9.     <headline>This is the headline</headline>
  10.     <para>This is the body text.</para>
  11.   </body>
  12. </story>
2、keyword.c

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <libxml/xmlmemory.h>
  5. #include <libxml/parser.h>

  6. void
  7. parseStory (xmlDocPtr doc, xmlNodePtr cur) {

  8.     xmlChar *key;
  9.     cur = cur->xmlChildrenNode;
  10.     while (cur != NULL) {
  11.      if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
  12.          key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
  13.          printf("keyword: %s\n", key);
  14.          xmlFree(key);
  15.       }
  16.     cur = cur->next;
  17.     }
  18.     return;
  19. }

  20. static void
  21. parseDoc(char *docname) {

  22.     xmlDocPtr doc;
  23.     xmlNodePtr cur;

  24.     doc = xmlParseFile(docname);
  25.     
  26.     if (doc == NULL ) {
  27.         fprintf(stderr,"Document not parsed successfully. \n");
  28.         return;
  29.     }
  30.     
  31.     cur = xmlDocGetRootElement(doc);
  32.     
  33.     if (cur == NULL) {
  34.         fprintf(stderr,"empty document\n");
  35.         xmlFreeDoc(doc);
  36.         return;
  37.     }
  38.     
  39.     if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
  40.         fprintf(stderr,"document of the wrong type, root node != story");
  41.         xmlFreeDoc(doc);
  42.         return;
  43.     }
  44.     
  45.     cur = cur->xmlChildrenNode;
  46.     while (cur != NULL) {
  47.         if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
  48.             parseStory (doc, cur);
  49.         }
  50.          
  51.     cur = cur->next;
  52.     }
  53.     
  54.     xmlFreeDoc(doc);
  55.     return;
  56. }

  57. int
  58. main(int argc, char **argv) {

  59.     char *docname;
  60.         
  61.     if (argc <= 1) {
  62.         printf("Usage: %s docname\n", argv[0]);
  63.         return(0);
  64.     }

  65.     docname = argv[1];
  66.     parseDoc (docname);

  67.     return (1);
  68. }
 
3、编译运行

[root@localhost txlib]# gcc keyword.c -o keyword -I/usr/local/include/libxml2 -lxml2
[root@localhost txlib]#
[root@localhost txlib]# ./keyword story.xml
keyword: example keyword
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值