c語言xml解析器
⑴ c 反射是什麼意思
c語言是一種靜態類型語言,它在編譯期間進行類型檢查,這就意味著代碼運行時類型信息是不可用的。但是有時候我們需要在運行時獲取類型信息,以便進行動態的操作。這就是C語言反射的概念,它允許我們在運行時獲取類型信息,調用函數等操作,從而實現更加靈活和動態的程序。
C語言反射廣泛應用於各種框架和庫中,例如著名的GTK圖形庫以及XML SAX解析器,都使用C語言的反射功能。其它一些應用場景,包括構建一些動態的通信協議,處理動態生成的類,或者實現插件式架構等。
C語言反射的基本原理是在編譯期間通過代碼生成器生成類型信息,然後在運行時將這些類型信息存儲在元數據中,並在需要的時候獲取這些信息。
在C語言中,我們可以使用結構體來表示一個特定類型的元數據。首先我們需要定義一個特定的結構體來存儲元數據信息,這個結構體中包含類型名、大小、成員變數信息、方法信息,以及指向類類型的指針等。然後我們可以用宏來定義類型信息,這些宏可以從定義的結構體中抽出類型名和成員變數信息。
有了這些元數據信息,我們就可以在運行時動態獲取數據,並實現一些動態操作,例如調用某個方法等。這就是C語言反射的基本原理。
⑵ 怎麼用c語言解析xml文件
我上次才給人寫過
xml文件內容
<?xml version="1.0" encoding="UTF-8" ?>
- <aicomoa_response>
- <country_list>
- <country>
<id>7</id>
<pid>0</pid>
<continent_id>1</continent_id>
<guohao>93</guohao>
<cntitle>阿富汗</cntitle>
<entitle>Afghanistan</entitle>
<hztitle>阿富汗</hztitle>
<jptitle>アフガニスタン</jptitle>
<kotitle>??????</kotitle>
<jp_pinyin>ア</jp_pinyin>
<pinyin>AFuHan</pinyin>
<sid>0</sid>
<jibie>1</jibie>
</country>
- <country>
<id>8</id>
<pid>0</pid>
<continent_id>2</continent_id>
<guohao>355</guohao>
<cntitle>阿爾巴尼亞</cntitle>
<entitle>Albania</entitle>
<hztitle>阿爾巴尼亞</hztitle>
<jptitle>アルバニア</jptitle>
<kotitle />
<jp_pinyin>ア</jp_pinyin>
<pinyin>AErBaNiYa</pinyin>
<sid>0</sid>
<jibie>1</jibie>
</country>
</country_list>
</aicomoa_response>
運行結果
Info[0]=[id:7|pid:0|continent_id:1|guohao:93|cntitle:阿富汗|entitle:Afghanistan|
hztitle:阿富汗|jptitle:アフガニスタン|kotitle:??????|jp_pinyin:ア|pinyin:AFuHan|
sid:0|jibie:1|]
Info[1]=[id:7|pid:0|continent_id:1|guohao:93|cntitle:阿富汗|entitle:Afghanistan|
hztitle:阿富汗|jptitle:アフガニスタン|kotitle:??????|jp_pinyin:ア|pinyin:AFuHan|
sid:0|jibie:1|]
Press any key to continue
代碼
#include <stdio.h>
#include <string.h>
main()
{
int i=0;
FILE *fp;
char szFileBuff[1024] = {0}, szBuff[100][1024];
char id[10] = {0}, pid[10] = {0}, continent_id[10] = {0}, guohao[10] = {0},
cntitle[64]= {0},entitle[64]= {0},hztitle[64] = {0},jptitle[64] = {0},
kotitle[64] = {0},jp_pinyin[64] = {0}, pinyin[64] = {0},sid[10] = {0},jibie[10] = {0};
char *lFirst, *lEnd;
fp = fopen("country.txt","r");
if (fp==NULL)
{
printf("read XML file error!\n");
}
while(fgets(szFileBuff, 1023, fp))
{
if ((lFirst = strstr(szFileBuff, "<id>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</id>");
memcpy(id, lFirst + 4, lEnd - lFirst - 4);
}
if ((lFirst = strstr(szFileBuff, "<pid>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</pid>");
memcpy(pid, lFirst + 5, lEnd - lFirst - 5);
}
if ((lFirst = strstr(szFileBuff, "<continent_id>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</continent_id>");
memcpy(continent_id, lFirst + 14, lEnd - lFirst - 14);
}
if ((lFirst = strstr(szFileBuff, "<guohao>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</guohao>");
memcpy(guohao, lFirst + 8, lEnd - lFirst - 8);
}
if ((lFirst = strstr(szFileBuff, "<cntitle>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</cntitle>");
memcpy(cntitle, lFirst + 9, lEnd - lFirst - 9);
}
if ((lFirst = strstr(szFileBuff, "<entitle>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</entitle>");
memcpy(entitle, lFirst + 9, lEnd - lFirst - 9);
}
if ((lFirst = strstr(szFileBuff, "<hztitle>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</hztitle>");
memcpy(hztitle, lFirst + 9, lEnd - lFirst - 9);
}
if ((lFirst = strstr(szFileBuff, "<jptitle>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</jptitle>");
memcpy(jptitle, lFirst + 9, lEnd - lFirst - 9);
}
if ((lFirst = strstr(szFileBuff, "<kotitle>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</kotitle>");
memcpy(kotitle, lFirst + 9, lEnd - lFirst - 9);
}
if ((lFirst = strstr(szFileBuff, "<jp_pinyin>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</jp_pinyin>");
memcpy(jp_pinyin, lFirst + 11, lEnd - lFirst - 11);
}
if ((lFirst = strstr(szFileBuff, "<pinyin>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</pinyin>");
memcpy(pinyin, lFirst + 8, lEnd - lFirst - 8);
}
if ((lFirst = strstr(szFileBuff, "<sid>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</sid>");
memcpy(sid, lFirst + 5, lEnd - lFirst - 5);
}
if ((lFirst = strstr(szFileBuff, "<jibie>")) != NULL)
{
lEnd = strstr(lFirst + 1, "</jibie>");
memcpy(jibie, lFirst + 7, lEnd - lFirst - 7);
}
if ((lFirst = strstr(szFileBuff, "</country>")) != NULL)
{
sprintf(szBuff[i],"id:%s|pid:%s|continent_id:%s|guohao:%s|cntitle:%s|entitle:%s|hztitle:%s|jptitle:%s|kotitle:%s|jp_pinyin:%s|pinyin:%s|sid:%s|jibie:%s|",
id,pid,continent_id,guohao,cntitle,entitle,hztitle,jptitle,kotitle,jp_pinyin, pinyin,sid,jibie);
printf("Info[%d]=[%s]\n",i++, szBuff);
}
}
fclose(fp);
}
補充:你這個就說得太籠統了,
1 你上傳的xml文件具體格式是什麼?
2 要在網頁上顯示的具體格式是什麼
3 你根本不知道怎麼做 所以也不知道怎麼問
我不用關心你的c語言的cgi吧?我才不管是用什麼上傳的
只有你說的嵌入式三個字 給我一點有用信息 就是解析這個xml用插件恐怕是不行
只能C語言
4 我現在只要求你的xml文件格式和 網頁上要顯示哪些xml中解析出來的信息
只要知道這些 我只需要在我的程序上加上生成html文件就行了
⑶ 請問怎麼用C解析XML文件
如果你想要用C語言解析XML文件,可以從網路上找到相應的XML處理庫,比如libxml2,然後在編譯你的程序時,鏈接這些庫中的函數。這將幫助你方便地解析和操作XML文件中的數據。
對於簡單的XML文件,或者你只是需要進行少量的數據讀取和寫入,你也可以自己編寫取值和賦值的函數。這種方式雖然可能需要更多的編程工作,但它可以讓你更精確地控制數據處理的流程。
例如,你可以使用C語言中的字元串處理函數來解析XML文件中的內容。首先,你需要讀取XML文件的內容到內存中,然後通過解析XML的結構來獲取你需要的數據。這包括找到特定的標簽,提取標簽中的文本內容等。
對於復雜的XML文件,使用專門的庫會更加方便。這些庫通常提供了豐富的API,可以幫助你輕松地處理XML文件。比如,libxml2就提供了一系列的函數,可以用來解析XML文件,查找特定的節點,獲取節點的屬性等。
使用這些庫的好處在於,它們已經經過了長時間的測試和優化,可以處理各種復雜的情況。而你自己編寫的函數則需要花費更多的時間來調試和優化。但是,對於簡單的XML文件,自己編寫函數可能會更加直接和高效。
無論你選擇哪種方式,都需要對XML文件的結構有深入的理解。這包括了解XML的基本語法,如標簽、屬性和文本等。只有充分理解了這些概念,你才能有效地處理XML文件中的數據。