xml解析处理 自己的笔记而已

 

#include <libxml/parser.h>

/**编码转换函数***/
char *ConvertEnc(char *encFrom, char *encTo, const char * in)
{
 static char bufin[1024], bufout[1024], *sin, *sout;/**静态局部变量**/
 int mode, lendin, lenout, ret, nline;
 iconv_t c_pt;
 if( (c_pc = iconv_open(encTo, encFrom) ) == (iconv_t) - 1 )/**申请一个转换描述符**/
 {
  printf("incov_open error/n");
  return NULL;
 }
 iconv(c_pc,NULL, NULL, NULL, NULL);/**转换状态恢复至初始状态**/

 lenin = strlen(in) + 1;
 lenout = 1024;
 sin = (char *)in;
 sout = bufout;
 ret = iconv(c_pc,&sin, (size_t *)&lenin, &sout, (*size_t)&lenout);
 /***函数原型:size_t iconv (iconv_t cd,const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);****/
 if(ret == -1)
 {
  return NULL;
 }
 iconv_close(c_pt);
 return bufout;
}

/**解析xml**/
int childStory(xmlNodePtr cur, char filename[21], char edition[5])
{
 xmlAttrPtr attrPtr;
 xmlChar  *szAttr;
 char   *tmp_szattr;
 char  *attr;
 while( NULL != cur )
 {
  if( !(xmlStrcmp(cur->name,(const xmlChar *)"text"))))
  {
   cur = cur->next;
   continue;
  }
  attrPtr = cur->properties;
  attr = NULL;
  attr = (char *)attrPtr->name;
  szAttr = xmlGetProp(cur, BAD_CAST, attrPtr->name);
  
  tmp_szattr = NULL;
  tmp_szattr = ConvertEnc("utf-8","gb2312",(char *)szAttr);
  if(tmp_szattr == NULL)
   tmp_szattr = szAttr;
  xmlFree(szAttr);
  attrPtr = attrPtr->next;
  cur = cur->next;
 }

  return 0;
}
int main()
{
 xmlDocPtr doc;
 xmlNodePtr curNode;
 doc =xmlReadFile(szDocName,"utf-8", XML_PARSE_RECOVER);/**szDocName=完整路径文件名**/
 if(NULL == doc)
 {
 }
 curNode = xmlDocGerRootElement(doc);/**获取根节点元素**/
 if(NULL == curNode)
 {
 }
 if(xmlStrcmp(curNode->name, BAD_CAST "root"))
 {
 }
 if(childStory(curNode->xmlChildernNode,ls_filename,ls_edition)<0) /***lsfilename文件名称,edition只是个日期/
 {
  strncpy(mvDocName,szDocName,strlen(szDocName));
  strcat(mvDocName,".bad");
 }
 else
 {
  strncpy(mvDocName,szDocName,strlen(szDocName));
  strcat(mvDocName,".bak");

 }
 xmlFreeDoc(doc);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值