微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

libxml解析XML文档

目前三种最流行的开源 c/c++解析xml库:libxml、Xerces、expat,且三者都是跨平台的。
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. <?xmlversion="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. if (doc== NULL ) {
  26. fprintf(stderr,"Document not parsed successfully. \n");
  27. return;
  28. }

  29. cur = xmlDocgetRootElement(doc);

  30. if (cur== NULL) {
  31. fprintf(stderr,"empty document\n");
  32. xmlFreeDoc(doc);
  33. return;
  34. }

  35. if (xmlStrcmp(cur->name,(const xmlChar*) "story")){
  36. fprintf(stderr,"document of the wrong type,root node != story");
  37. xmlFreeDoc(doc);
  38. return;
  39. }

  40. cur = cur->xmlChildrenNode;
  41. while (cur!= NULL) {
  42. if ((!xmlStrcmp(cur->name,(const xmlChar*)"storyinfo"))){
  43. parseStory (doc, cur);
  44. }

  45. cur = cur->next;
  46. }

  47. xmlFreeDoc(doc);
  48. return;
  49. }

  50. int
  51. main(int argc, char**argv){

  52. char *docname;

  53. if (argc<= 1){
  54. printf("Usage: %s docname\n", argv[0]);
  55. return(0);
  56. }

  57. docname = argv[1];
  58. parseDoc (docname);

  59. return (1);
  60. }
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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。