/*?前段時間恰好做過類似的東西,代碼可以給你參考下。
創(chuàng)新互聯(lián)主要從事網站設計、成都網站設計、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務南昌縣,十多年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220
*??Xml配置見最后
*/
typedef?struct?SrcFileFmt
{
int???ColID;
char??ColCode[64];??????/*?字段英文名稱?*/
char??ColName[128];?????/*?字段中文名稱*/
char??ColType[20];??????/*?字段類型(包含長度)?*/
char??ColComment[128];??/*?字段描述?*/
}SrcFileFmt;
int?main(int?argc,?char?**argv)
{
SrcFileFmt?SrcFileFmt[128];
int?iNum?=?-1;
if?(?2??argc?)
{
printf("Usage:?%s?SrcXmlFile\n",?argv[0]);
return?-1;
}
iNum?=?parseSourceCfg(SrcCfgFile,?SrcFileFmt);
if?(iNum?==?-1)
{
return?-1;
}
return?0;
}
/*?調用此函數后,xml文件的內容會被存儲到結構體數組SrcFileFmt?srcfilefmt[]中
*?此函數依賴于libxml2-2.9.2.tar.xz
*/
int?parseSourceCfg(char?*FileName,?SrcFileFmt?srcfilefmt[])
{?/*?解析源文件xml,FileName?為源xml文件名?*/
xmlDocPtr?doc;
xmlNodePtr?cur,?root;
char?sFileName[64]?=?{'\0'};
int?cnt?=?0;
if?(FileName?==?NULL)
{
return?-1;
}
sprintf(sFileName,?"%s.xml",?FileName);
doc?=?xmlParseFile(sFileName);
if?(doc?==?NULL)
{
return?-1;
}
root?=?xmlDocGetRootElement(doc);
if?(root?==?NULL)?{
xmlFreeDoc(doc);
return(-1);
}
if?(xmlStrcmp(root-name,?(const?xmlChar?*)?"SrcRoot"))
{
xmlFreeDoc(doc);
return?-1;
}
cur?=?root-xmlChildrenNode;
while?(cur?!=?NULL)?
{
if?((!xmlStrcmp(cur-name,?(const?xmlChar?*)"Column")))
{
xmlChar?*key;
xmlNodePtr?cur_sub?=?cur;
cur_sub?=?cur_sub-xmlChildrenNode;
while?(cur_sub?!=?NULL)?
{
if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColID")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
srcfilefmt[cnt].ColID?=?atoi((char*)key);
xmlFree(key);
}
if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColCode")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColCode,?(char*)key);
xmlFree(key);
}
else?if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColName")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColName,?(char*)key);
xmlFree(key);
}
else?if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColType")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColType,?(char*)key);
xmlFree(key);
}
else?if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColComment")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColComment,?(char*)key);
xmlFree(key);
}
cur_sub?=?cur_sub-next;
}
cnt++;
}
cur?=?cur-next;
}
xmlFreeDoc(doc);?
return?cnt;
}
SrcRoot
Column
ColID1/ColID
ColCodekmh/ColCode
ColName字段1/ColName
ColTypeVARCHAR(11)/ColType
/Column
Column
ColID2/ColID
ColCodedfkmh/ColCode
ColName字段2/ColName
ColTypeVARCHAR(11)/ColType
/Column
Column
ColID3/ColID
ColCodehbh/ColCode
ColName字段3/ColName
ColTypeINTEGER(10)/ColType
/Column
/SrcRoot
//////////////////////////////////////////////////// /// 說明 : 解析XML文件 返回XML的根節(jié)點 /// 參數 : /// : xml xml文件路徑 [in] /// : buffer 供解析用的緩沖 [in] /// : buffer_len 緩沖大小(單位:字節(jié)) [in] /// : error_reason 執(zhí)行出錯時保存錯誤原因 [in] /// : root XML的根節(jié)點 [out] /// 返回 : 成功 返回 失敗返回 /// 說明 : /// : 問 :供解析用的緩沖應該取多大比較合適呢? /// : 答 :供解析用的緩沖主要用來存放XML樹 所以 buffer_len = (XML文件的大小) * 即可 /// :
int mini_parse_xml (char* xml char* buffer int buffer_len char error_reason[ ] MINI_XML_NODE** root);
//////////////////////////////////////////////////// /// 說明 : 查找特定節(jié)點的子節(jié)點 /// 參數 : /// : father 父結點 [in] /// : name 子孩子節(jié)點名 [in] /// : child 子節(jié)點 [out]
int mini_find_child (MINI_XML_NODE* father char* name MINI_XML_NODE** child);
//////////////////////////////////////////////////// /// 說明 : 查找特定節(jié)點的屬性值 /// 參數 : /// : node 節(jié)點 [in] /// : name 屬性名 [in] /// : value 屬性值 [out]
int mini_find_attribute (MINI_XML_NODE* node char* name char** value);
//////////////////////////////////////////////////// /// 說明 : 打印XML樹 供調試用 int mini_print_tree (MINI_XML_NODE* root int layer);
#if defined (__cplusplus) || defined (c_plusplus) } #endif #endif
lishixinzhi/Article/program/net/201311/14908
xml文件和txt文件相同,使用普通的文本操作函數即可讀取。
1、C語言標準庫提供了一系列文件操作函數。文件操作函數一般以f+單詞的形式來命名(f是file的簡寫),其聲明位于stdio.h頭文件當中。例如:fopen、fclose函數用于文件打開與關閉;fscanf、fgets函數用于文件讀??;fprintf、fputs函數用于文件寫入;ftell、fseek函數用于文件操作位置的獲取與設置。
2、例程:
#includestdio.h
int?a;
char?b,c[100];
int?main(){
FILE?*?fp1?=?fopen("input.xml",?"r");//打開xml格式輸入文件
FILE?*?fp2?=?fopen("output.txt",?"w");//打開輸出文件
if?(fp1==NULL?||?fp2==NULL)?{//若打開文件失敗則退出
puts("不能打開文件!");
rturn?0;
}
fscanf(fp1,"%d",a);//從輸入文件讀取一個整數
b=fgetc(fp1);//從輸入文件讀取一個字符
fgets(c,100,fp1);//從輸入文件讀取一行字符串
printf("%ld",ftell(fp1));//輸出fp1指針當前位置相對于文件首的偏移字節(jié)數
fputs(c,fp2);//向輸出文件寫入一行字符串
fputc(b,fp2);//向輸出文件寫入一個字符
fprintf(fp2,"%d",a);//向輸出文件寫入一個整數
fclose(fp1);//關閉輸入文件
fclose(fp2);//關閉輸出文件,相當于保存
return?0;
}
把所有的數據當做一個字符串
收到數據后先strstr(buffer,"?xml version=\"1.0\" encoding=\"UTF-8\"?");
如果返回的是NULL則表示沒有這段 退出
buffer是你收到的數據起始地址