Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131855
  • 博文数量: 47
  • 博客积分: 1220
  • 博客等级: 中尉
  • 技术积分: 565
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-09 10:07
个人简介

unix/linux shell、c/c++、java、oracle pl/sql、db2 sql pl、informatica

文章分类

全部博文(47)

文章存档

2012年(11)

2011年(3)

2010年(8)

2009年(20)

2008年(5)

我的朋友

分类: LINUX

2012-07-24 13:42:07

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

一、libxml库下载
 
libxml官网:
libxml库下载:
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


 
阅读(5899) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~