?? 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 + -