FREEBSD上如何使用c语言和libxml2简单解析XML

由于我们的前台使用C语言编写CGI,如果对方提供XML接口给我们传递数据,就必须有解析的程序,这也可能是今后数据接口的最通用的办法。经过研究,正如使用C语言来生成页面一样,显然使用C语言解析XML要比PHP和ASP要麻烦很多。
同其它语言一样,解析的方法一般都是调用现有的解析器,因为这样省时省力。PHP4是内置的EXPAT,PHP5是内置的LIBXML2,WIN平台可以调用MSXML。FREEBSD上使用C语言,最流行的就是调用EXPAT和LIBXML2,由于PHP基于某些原因放弃了EXPAT,所以我主要试用了LIBXML2。
  
LIBXML2主页是http://xmlsoft.org

安装过程:(需要ROOT权限)
gunzip -c libxml2-2.6.22.tar.gz | tar xvf -
cd libxml2-2.6.22
./configure
make

su
make install
exit

安装完成后就可以使用简单的代码解析XML文件,包括本地和远程的文件,但是在编码上有一些问题。LIBXML默认只支持UTF-8的编码,无论输入输出都是UTF-8,所以如果你解析完一个XML得到的结果都是UTF-8的,如果需要输出GB2312或者其它编码,需要ICONV来做转码(生成UTF-8编码的文件也可以用它做)。

ICONV的安装过程和LIBXML2一样。

下面是一些例子,包括解析XML和转码
FREEBSD上如何使用c语言和libxml2简单解析XML# i nclude <stdio.h>
FREEBSD上如何使用c语言和libxml2简单解析XML# i nclude <string.h>
FREEBSD上如何使用c语言和libxml2简单解析XML# i nclude <stdlib.h>
FREEBSD上如何使用c语言和libxml2简单解析XML# i nclude <libxml/xmlmemory.h>
FREEBSD上如何使用c语言和libxml2简单解析XML# i nclude <libxml/parser.h>
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML#i nclude <iconv.h>
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML//***********************************************************************//
FREEBSD上如何使用c语言和libxml2简单解析XML
//* d_ConvertCharset: 编码转换函数,可以转换任意两种编码格式
FREEBSD上如何使用c语言和libxml2简单解析XML
//* ddr/2005-11-10
FREEBSD上如何使用c语言和libxml2简单解析XML
//* 此函数需要库libiconv,编译时需加-liconv,如果找不到库,编译时加-L/usr/local/lib
FREEBSD上如何使用c语言和libxml2简单解析XML
// 其中/usr/local/lib为安装库文件的目录
FREEBSD上如何使用c语言和libxml2简单解析XML
// 使用时需要#i nclude <iconv.h>,如果找不到此头文件请在编译时加-I/usr/local/include
FREEBSD上如何使用c语言和libxml2简单解析XML
// 其中/usr/local/include为安装头文件的目录
FREEBSD上如何使用c语言和libxml2简单解析XML
//* 需要使用static变量作为输出的缓冲区,这里设置的最大长度是1024,可以根据需要修改,以避免溢出
FREEBSD上如何使用c语言和libxml2简单解析XML
// 由于使用了static变量,所以这个函数是不可重入的,非线程安全的
FREEBSD上如何使用c语言和libxml2简单解析XML
// 可以改用new的方式来实现可重入
FREEBSD上如何使用c语言和libxml2简单解析XML
//***********************************************************************//
FREEBSD上如何使用c语言和libxml2简单解析XML
static char s_strBufOut[1024];
FREEBSD上如何使用c语言和libxml2简单解析XMLchar *d_ConvertCharset(char *cpEncodeFrom, char *cpEncodeTo, const char *cpInput)
FREEBSD上如何使用c语言和libxml2简单解析XML{
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  char *cpOut;
FREEBSD上如何使用c语言和libxml2简单解析XML  size_t iInputLen, iOutLen, iReturn;
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  iconv_t c_pt;
FREEBSD上如何使用c语言和libxml2简单解析XML  if ((c_pt = iconv_open(cpEncodeTo, cpEncodeFrom)) == (iconv_t)-1)
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    printf("iconv_open failed!\n");
FREEBSD上如何使用c语言和libxml2简单解析XML    return NULL;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  iconv(c_pt, NULL, NULL, NULL, NULL);
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  iInputLen = strlen(cpInput) + 1;
FREEBSD上如何使用c语言和libxml2简单解析XML  iOutLen = 1024;
FREEBSD上如何使用c语言和libxml2简单解析XML  cpOut = s_strBufOut;
FREEBSD上如何使用c语言和libxml2简单解析XML  iReturn = iconv(c_pt, &cpInput, &iInputLen, &cpOut, &iOutLen);
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  if (iReturn == -1)
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    return NULL;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  iconv_close(c_pt);
FREEBSD上如何使用c语言和libxml2简单解析XML  return s_strBufOut;
FREEBSD上如何使用c语言和libxml2简单解析XML}

FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML//输出每一项的内容,使用GB2312编码输出
FREEBSD上如何使用c语言和libxml2简单解析XML
void parseItem (xmlDocPtr doc, xmlNodePtr cur) 
FREEBSD上如何使用c语言和libxml2简单解析XML{
FREEBSD上如何使用c语言和libxml2简单解析XML  xmlChar *key;
FREEBSD上如何使用c语言和libxml2简单解析XML  cur = cur->xmlChildrenNode;
FREEBSD上如何使用c语言和libxml2简单解析XML  while (cur != NULL) 
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML   if ((!xmlStrcmp(cur->name, (const xmlChar *)"songname"))) 
FREEBSD上如何使用c语言和libxml2简单解析XML   {
FREEBSD上如何使用c语言和libxml2简单解析XML     key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
FREEBSD上如何使用c语言和libxml2简单解析XML     printf("songname: %s\n", d_ConvertCharset("utf-8", "gb2312", (char *)key));
FREEBSD上如何使用c语言和libxml2简单解析XML     xmlFree(key);
FREEBSD上如何使用c语言和libxml2简单解析XML   }
    
FREEBSD上如何使用c语言和libxml2简单解析XML   else if ((!xmlStrcmp(cur->name, (const xmlChar *)"songurl"))) 
FREEBSD上如何使用c语言和libxml2简单解析XML   {
FREEBSD上如何使用c语言和libxml2简单解析XML     key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
FREEBSD上如何使用c语言和libxml2简单解析XML     printf("songurl: %s\n", d_ConvertCharset("utf-8", "gb2312", (char *)key));
FREEBSD上如何使用c语言和libxml2简单解析XML     xmlFree(key);
FREEBSD上如何使用c语言和libxml2简单解析XML   }
    
FREEBSD上如何使用c语言和libxml2简单解析XML   else if ((!xmlStrcmp(cur->name, (const xmlChar *)"singer"))) 
FREEBSD上如何使用c语言和libxml2简单解析XML   {
FREEBSD上如何使用c语言和libxml2简单解析XML     key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
FREEBSD上如何使用c语言和libxml2简单解析XML     printf("singer: %s\n", d_ConvertCharset("utf-8", "gb2312", (char *)key));
FREEBSD上如何使用c语言和libxml2简单解析XML     xmlFree(key);
FREEBSD上如何使用c语言和libxml2简单解析XML   }
    
FREEBSD上如何使用c语言和libxml2简单解析XML   else if ((!xmlStrcmp(cur->name, (const xmlChar *)"singerurl"))) 
FREEBSD上如何使用c语言和libxml2简单解析XML   {
FREEBSD上如何使用c语言和libxml2简单解析XML     key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
FREEBSD上如何使用c语言和libxml2简单解析XML     printf("singerurl: %s\n", d_ConvertCharset("utf-8", "gb2312", (char *)key));
FREEBSD上如何使用c语言和libxml2简单解析XML     xmlFree(key);
FREEBSD上如何使用c语言和libxml2简单解析XML   }

FREEBSD上如何使用c语言和libxml2简单解析XML   
FREEBSD上如何使用c语言和libxml2简单解析XML      cur = cur->next;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XMLreturn;
FREEBSD上如何使用c语言和libxml2简单解析XML}

FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XMLvoid parseDoc(char *docname) 
FREEBSD上如何使用c语言和libxml2简单解析XML{
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  xmlDocPtr doc;  //解析树
FREEBSD上如何使用c语言和libxml2简单解析XML
  xmlNodePtr cur;  //当前节点
FREEBSD上如何使用c语言和libxml2简单解析XML
  
FREEBSD上如何使用c语言和libxml2简单解析XML  doc = xmlParseFile(docname);
FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  if (doc == NULL ) 
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    fprintf(stderr,"Document not parsed successfully. \n");
FREEBSD上如何使用c语言和libxml2简单解析XML    return;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  //得到根节点
FREEBSD上如何使用c语言和libxml2简单解析XML
  cur = xmlDocGetRootElement(doc);
FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  if (cur == NULL) 
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    fprintf(stderr,"empty document\n");
FREEBSD上如何使用c语言和libxml2简单解析XML    xmlFreeDoc(doc);
FREEBSD上如何使用c语言和libxml2简单解析XML    return;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  //判断根节点是不是mp3
FREEBSD上如何使用c语言和libxml2简单解析XML
  if (xmlStrcmp(cur->name, (const xmlChar *) "mp3")) 
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    fprintf(stderr,"document of the wrong type, root node != mp3");
FREEBSD上如何使用c语言和libxml2简单解析XML    xmlFreeDoc(doc);
FREEBSD上如何使用c语言和libxml2简单解析XML    return;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  //得到当前节点的第一个子节点,即第一个ITEM
FREEBSD上如何使用c语言和libxml2简单解析XML
  cur = cur->xmlChildrenNode;
FREEBSD上如何使用c语言和libxml2简单解析XML  while (cur != NULL) 
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    if ((!xmlStrcmp(cur->name, (const xmlChar *)"item")))
FREEBSD上如何使用c语言和libxml2简单解析XML    {
FREEBSD上如何使用c语言和libxml2简单解析XML      //输出每个ITEM
FREEBSD上如何使用c语言和libxml2简单解析XML
      parseItem (doc, cur);
FREEBSD上如何使用c语言和libxml2简单解析XML    }

FREEBSD上如何使用c语言和libxml2简单解析XML     
FREEBSD上如何使用c语言和libxml2简单解析XML    cur = cur->next;
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML  
FREEBSD上如何使用c语言和libxml2简单解析XML  xmlFreeDoc(doc);
FREEBSD上如何使用c语言和libxml2简单解析XML  return;
FREEBSD上如何使用c语言和libxml2简单解析XML}

FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML//入参可以是一个文件,也可以是一个URL,要求必须是UTF-8编码
FREEBSD上如何使用c语言和libxml2简单解析XML
int main(int argc, char **argv) 
FREEBSD上如何使用c语言和libxml2简单解析XML{
FREEBSD上如何使用c语言和libxml2简单解析XML  char *docname;
FREEBSD上如何使用c语言和libxml2简单解析XML    
FREEBSD上如何使用c语言和libxml2简单解析XML  if (argc <= 1) 
FREEBSD上如何使用c语言和libxml2简单解析XML  {
FREEBSD上如何使用c语言和libxml2简单解析XML    printf("Usage: %s docname\n", argv[0]);
FREEBSD上如何使用c语言和libxml2简单解析XML    return(0);
FREEBSD上如何使用c语言和libxml2简单解析XML  }

FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  docname = argv[1];
FREEBSD上如何使用c语言和libxml2简单解析XML  parseDoc (docname);
FREEBSD上如何使用c语言和libxml2简单解析XML
FREEBSD上如何使用c语言和libxml2简单解析XML  return 0;
FREEBSD上如何使用c语言和libxml2简单解析XML}
上一篇:常用的DIV+CSS网站布局的基本框架结构-完整版


下一篇:虚拟主机推出流量型独享虚拟主机新规格