📄 code_conv.cpp
字号:
#include "stdafx.h"
#include <iconv.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <string>
#include "Code_Conv.h"
//代码转换:从一种编码转为另一种编码
int code_convert(char* from_charset, char* to_charset, char* inbuf,
int inlen, char* outbuf, int outlen)
{
iconv_t cd;
char** pin = &inbuf;
char** pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if(cd == 0)
return -1;
memset(outbuf,0,outlen);
if(iconv(cd,(const char**)pin,(unsigned int *)&inlen,pout,(unsigned int*)&outlen)
== -1)
return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
//成功则返回一个动态分配的char*变量,需要在使用完毕后手动free,失败返回NULL
char* u2g(char *inbuf)
{
int nOutLen = 2 * strlen(inbuf) + 1;
char* szOut = (char*)malloc(nOutLen);
if (-1 == code_convert("utf-8","gb2312",inbuf,strlen(inbuf),szOut,nOutLen))
{
free(szOut);
szOut = NULL;
}
return szOut;
}
//GB2312码转为UNICODE码
//成功则返回一个动态分配的char*变量,需要在使用完毕后手动free,失败返回NULL
char* g2u(char *inbuf)
{
int nOutLen = 2 * strlen(inbuf) + 1;
char* szOut = (char*)malloc(nOutLen);
if (-1 == code_convert("gb2312","utf-8",inbuf,strlen(inbuf),szOut,nOutLen))
{
free(szOut);
szOut = NULL;
}
return szOut;
}
xmlXPathObjectPtr get_nodeset(xmlDocPtr doc, const xmlChar *xpath)
{
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if (context == NULL)
{
printf("context is NULL\n");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if (result == NULL)
{
printf("xmlXPathEvalExpression return NULL\n");
return NULL;
}
if (xmlXPathNodeSetIsEmpty(result->nodesetval))
{
xmlXPathFreeObject(result);
printf("nodeset is empty\n");
return NULL;
}
return result;
}
string getXmlString(xmlDocPtr doc, const char *szXpath)
{
xmlXPathObjectPtr result;
string strRel;
result = get_nodeset(doc,BAD_CAST szXpath);
if (result == NULL)
{
printf("xmlXPathEvalExpression return NULL\n");
return NULL;
}
xmlNodeSetPtr nodeSetPtr = result->nodesetval;
//查出符合xpath的节点集合
if (xmlXPathNodeSetIsEmpty(nodeSetPtr))
{
xmlXPathFreeObject(result);
printf("nodeset is empty\n");
return NULL;
}
//查出节点集合中唯一节点的内容值
xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];
strRel = (const char*)xmlNodeGetContent(nodePtr);
return strRel;
}
int getXmlInt(xmlDocPtr doc, const char* szXpath)
{
xmlXPathObjectPtr result;
int iRel;
result = get_nodeset(doc,BAD_CAST szXpath);
if (result == NULL)
{
printf("xmlXPathEvalExpression return NULL\n");
return NULL;
}
xmlNodeSetPtr nodeSetPtr = result->nodesetval;
//查出符合xpath的节点集合
if (xmlXPathNodeSetIsEmpty(nodeSetPtr))
{
xmlXPathFreeObject(result);
printf("nodeset is empty\n");
return NULL;
}
xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];
iRel = atoi((const char*)xmlNodeGetContent(nodePtr));
return iRel;
}
xmlDocPtr openXmlFile(const char* szXmlFilename)
{
xmlDocPtr doc; //定义解析文档指针
xmlNodePtr curNodePtr; //定义结点指针
doc = xmlReadFile(szXmlFilename,"GB2312",XML_PARSE_RECOVER); //解析文件
if (doc == NULL )
{
fprintf(stderr,"Document not parsed successfully. \n");
xmlFreeDoc(doc);
exit(1);
}
curNodePtr = xmlDocGetRootElement(doc); //确定文档根元素
/*检查确认当前文档中包含内容*/
if (curNodePtr == NULL)
{
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
exit(1);
}
/*在这个例子中,我们需要确认文档是正确的类型。“main”是在这个示例中使用文档的根类型。*/
if (xmlStrcmp(curNodePtr->name, (const xmlChar *) "main"))
{
fprintf(stderr,"document of the wrong type, root node != main");
xmlFreeDoc(doc);
exit(1);
}
return doc;
}
void closeXmlFile(xmlDocPtr doc)
{
xmlFreeDoc(doc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -