1:環境配置
包含目錄下? ? 包含include? ? libxml2_64\include?? ? ? 包含xmllib庫路徑 libxml2_64? ? 注意 libxml分為32位程序和64位程序,這兩種的環境需要的lib不一樣,需要分別下載
需要使用庫??libxml2.lib??
注意:往xml文件中寫入數據只能是utf-8類型的 所以當往xml文件中輸入中文時候需要把GBK2312轉換為utf-8,解析的時候需要把utf8轉換為GBK2312,使用的函數
static int GB2312ToUtf8(const char* gb2312, char* utf8)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8, len, NULL, NULL);
if(wstr) delete[] wstr;
return len;
}
//UTF-8到GB2312的轉換
static int Utf8ToGB2312(const char* utf8, char* gb2312)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, gb2312, len, NULL, NULL);
if(wstr) delete[] wstr;
return len;
}
使用xml文件
創建xml文件并寫入相應節點
int write_xml(char *filename,char*node,char*data) //filename:: xml文件名 node::寫入的節點名 data:寫入的節點數據
{
xmlDocPtr doc;
doc = xmlReadFile(filename, "GB2312", XML_PARSE_NOBLANKS);
if(doc == NULL) //文件不存在 創建一個新文件
{
xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");
//設置根節點
xmlDocSetRootElement(doc,root_node);
xmlNewTextChild(root_node, NULL, BAD_CAST node, BAD_CAST data);
xmlSaveFormatFileEnc(filename,doc,"GB2312",1);
xmlFreeDoc(doc);
return 0;
}
xmlNodePtr cur;
cur = xmlDocGetRootElement(doc);
if(cur == NULL)
{
xmlFreeDoc(doc);
return -1;
}
xmlNewTextChild(cur, NULL, BAD_CAST node, BAD_CAST data);
int nRel = xmlSaveFormatFileEnc(filename,doc,"GB2312",1);
xmlFreeDoc(doc);
return 0;
}
?
解析xml文件
xmlChar* ReadXml(char* filename,char* node_content) //filename:xml文件名 node_content:xml節點的節點名
{
xmlDocPtr doc; //定義解析文檔指針
xmlNodePtr node; //定義結點指針(你需要它為了在各個結點間移動)
xmlKeepBlanksDefault(0); //避免將空格當作一個節點
doc = xmlParseFile(filename);
if(doc == NULL) //xml文件不存在
{
fprintf(stderr,"parse error\n");
return NULL;
}
node = xmlDocGetRootElement(doc);
if(node == NULL)
{
fprintf(stderr, "doc has no content\n");
}
char str[256]={0};
node = node->children;
while(node != NULL)
{
if(xmlStrcmp(node->name,(const xmlChar*)node_content)==0)
{
return xmlNodeGetContent(node);
}
node = node->next;
}
xmlFreeDoc(doc);
return NULL;
}
注意:xml文件原型其實是個二叉樹,用鏈表組成的,使用的時候首先打開文件,找到頭節點,然后在往頭結點添加新節點和給新節點添加屬性,具體不一一列舉
特別注意:xml文件的節點名稱不能是數字,必須是字母(字母后面可以接數字),否則解析xml文件時不能識別該節點