c語言讀寫xml
1. c語言 如何讀取xml文件中的數據並存入一個結構體中
一般是用第三方比如TinyXml,或者你自己實現。
2. 怎麼用c語言編一個詞法分析器
簡而言之就是先畫一個狀態圖,然後根據圖來編碼就行
一個簡單的xml的詞法分析器供參考
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
typedef
struct
{
char
*p;
int
len;
}
xml_Text;
typedef
enum
{
xml_tt_U,
/*
Unknow
*/
xml_tt_H,
/*
Head
<?xxx?>*/
xml_tt_E,
/*
End
</xxx>
*/
xml_tt_B,
/*
Begin
<xxx>
*/
xml_tt_BE,
/*
Begin
End
<xxx/>
*/
xml_tt_T
/*
Text
xxx
*/
}
xml_TokenType;
typedef
struct
{
xml_Text
text;
xml_TokenType
type;
}
xml_Token;
int
xml_initText(xml_Text
*pText,
char
*s)
{
pText->p
=
s;
pText->len
=
strlen(s);
return
0;
}
int
xml_initToken(xml_Token
*pToken,
xml_Text
*pText)
{
pToken->text.p
=
pText->p;
pToken->text.len
=
0;
pToken->type
=
xml_tt_U;
return
0;
}
int
xml_print(xml_Text
*pText)
{
int
i;
for
(i
=
0;
i
<
pText->len;
i++)
{
putchar(pText->p[i]);
}
return
0;
}
int
xml_println(xml_Text
*pText)
{
xml_print(pText);
putchar('\n');
return
0;
}
int
xml_getToken(xml_Text
*pText,
xml_Token
*pToken)
{
char
*start
=
pToken->text.p
+
pToken->text.len;
char
*p
=
start;
char
*end
=
pText->p
+
pText->len;
int
state
=
0;
pToken->text.p
=
p;
pToken->type
=
xml_tt_U;
for
(;
p
<
end;
p++)
{
switch(state)
{
case
0:
switch(*p)
{
case
'<':
state
=
1;
break;
default:
state
=
7;
break;
}
break;
case
1:
switch(*p)
{
case
'?':
state
=
2;
break;
case
'/':
state
=
4;
break;
default:
state
=
5;
break;
}
break;
case
2:
switch(*p)
{
case
'?':
state
=
3;
break;
default:
state
=
2;
break;
}
break;
case
3:
switch(*p)
{
case
'>':
pToken->text.len
=
p
-
start
+
1;
pToken->type
=
xml_tt_H;
return
1;
default:
state
=
-1;
break;
}
break;
case
4:
switch(*p)
{
case
'>':
pToken->text.len
=
p
-
start
+
1;
pToken->type
=
xml_tt_E;
return
1;
default:
state
=
4;
break;
}
break;
case
5:
switch(*p)
{
case
'>':
pToken->text.len
=
p
-
start
+
1;
pToken->type
=
xml_tt_B;
return
1;
case
'/':
state
=
6;
break;
default:
state
=
5;
break;
}
break;
case
6:
switch(*p)
{
case
'>':
pToken->text.len
=
p
-
start
+
1;
pToken->type
=
xml_tt_BE;
return
1;
default:
state
=
-1;
break;
}
break;
case
7:
switch(*p)
{
case
'<':
p--;
pToken->text.len
=
p
-
start
+
1;
pToken->type
=
xml_tt_T;
return
1;
default:
state
=
7;
break;
}
break;
default:
pToken->text.len
=
p
-
start
+
1;
pToken->type
=
xml_tt_T;
return
1;
}
}
return
0;
}
int
main()
{
int
ret
=
0;
xml_Text
xml;
xml_initText(&xml,
"<?xml?><root>
ss
<haha>hoho</haha></root>");
xml_Token
token;
xml_initToken(&token,
&xml);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(&xml,
&token);
printf("ret=%d;text=",ret);
xml_print(&token.text);
printf(";type=%d;\n\n",
token.type);
return
0;
}
3. c語言如何調用xml的介面函數
/***************
<?xmlversion="1.0"encoding="utf-8"?>
<Cases>
<case>
<No>001</No>
<CopyFilesrc="C: est.txt"dest="D: est.txt"></CopyFile>
</case>
<case>
<No>002</No>
<DelFile>C: est.txt</DelFile>
</case>
</Cases>
*******************/
//我們用MFC來讀取上述xml,代碼如下:
voidReadXml(CStringstrXmlPath)
{
MSXML2::IXMLDOMDocumentPtrpDoc;
::CoInitialize(NULL);
HRESULThr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(!SUCCEEDED(hr))
{
MessageBox(_T("創建DOMDocument對象失敗。 請檢查運行環境"),_T("錯誤"),MB_ICONERROR);
return;
}
//讀取xml
pDoc->put_async(VARIANT_FALSE);
VARIANT_BOOLbhr=pDoc->load((_variant_t)strXmlPath);
if(bhr!=VARIANT_TRUE){
MessageBox(_T("無法正確讀取xml文件"),_T("錯誤"),MB_ICONERROR);
return;
}
//根節點取得
MSXML2::IXMLDOMElementPtrroot=pDoc->documentElement;
//取得根節點的名字
_variant_tstrRootName=root->nodeName;
_bstr_twstrRootName(strRootName.bstrVal);
MSXML2::IXMLDOMNodeListPtrnodeList=root->GetchildNodes();//cases
//解析cases的子節點
ReadCases(nodeList);
}
voidReadCases(MSXML2::IXMLDOMNodeListPtrnodeList)
{
intilength=nodeList->Getlength();
for(intnodeCount=0;nodeCount<ilength;nodeCount++){
MSXML2::IXMLDOMNodePtrnodePtr=nodeList->nextNode();
_variant_tstrNodeName=nodePtr->GetnodeName();
_variant_tstrNodeValue=nodePtr->GetnodeValue();
//讀取case節點下的子節點
ReadCase(nodePtr->GetchildNodes());
}
}
voidReadCase(MSXML2::IXMLDOMNodeListPtrnodeList)
{
CStringstrLogInfo;
strLogInfo.Empty();
CStringstrNo;//case編號
CStringstrSrcFile;//源文件
CStringstrDestFile;//目標文件
for(intnodeCount=0;nodeCount<nodeList->Getlength();nodeCount++)
{
MSXML2::IXMLDOMNodePtrnodePtr=nodeList->nextNode();
_variant_tstrCaseNodeName=nodePtr->GetnodeName();
_variant_tstrCaseNodeValue=nodePtr->Gettext();
BSTRbStrTemp=strCaseNodeName.bstrVal;
CStringstrTemp=CString(bStrTemp);
SysFreeString(bStrTemp);
CStringstrNodeName=strTemp;
//節點的值,如何取得?
if(0==strNodeName.CompareNoCase(_T("NO")))
{
strNo=(BSTR)strCaseNodeValue.pbstrVal;
//取得的值可以列印出來
printf(strNo);
}
//節點有屬性值,該怎麼處理?
elseif(0==strNodeName.CompareNoCase(_T("CopyFile")))
{
strSrcFile.Empty();
strDestFile.Empty();
//取得節點的屬性值
MSXML2::=nodePtr->Getattributes();
for(intj=0;j<pDOMAttrList->Getlength();j++)
{
MSXML2::IXMLDOMNodePtrpDOMAttr=pDOMAttrList->Getitem(j);
//取得源文件路徑
if(CompareNoCase((char*)pDOMAttr->GetnodeName(),_T("src")))
{
strSrcFile=pDOMAttr->GetnodeTypedValue();
//取得目標文件路徑
}elseif(CompareNoCase((char*)pDOMAttr->GetnodeName(),_T("dest")))
{
strDestFile=pDOMAttr->GetnodeTypedValue();
}
CopyFile(strSrcFile,strDestFile,FALSE);
}
elseif(0==strNodeName.CompareNoCase(_T("DelFile")))
{
strDestFile.Empty();
strDestFile=CString((BSTR)strCaseNodeValue.pbstrVal);
DeleteFile(strDestFile);
}
}
}
//為了能夠讓MFC認識MSXML2,我們需要引入相應的dll,代碼如下;
#import"msxml4.dll"
4. 有沒有C語言的對xml文件讀寫操作的API
libxml2就可以啊
Libxml2 是一個xml c語言版的解析器,本來是為Gnome項目開發的工具,是一個基於MIT License的免費開源軟體。它除了支持c語言版以外,還支持c++、PHP、Pascal、Ruby、Tcl等語言的綁定,能在Windows、Linux、Solaris、MacOsX等平台上運行。功能還是相當強大的,相信滿足一般用戶需求沒有任何問題。具體的介紹就參考 http://xmlsoft.org/
5. C語言xml解析
把所有的數據當做一個字元串
收到數據後先strstr(buffer,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
如果返回的是NULL則表示沒有這段 退出
buffer是你收到的數據起始地址
6. 怎麼用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文件就行了
7. 怎麼用C語言寫一個簡單的XML文件
用VC吧,下面有一個例子,你參照下:
voidCreateXml()
{
CoInitialize(NULL);
//創建文檔
MSXML2::IXMLDOMDocument2PtrpXMLDoc=NULL;
//創建DOMDocument對象
HRESULThr=pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if(!SUCCEEDED(hr))
{
return;
}
//
MSXML2::=NULL;
pXMLProc=pXMLDoc->createProcessingInstruction("xml","version='1.0'encoding='UTF-8'");
_variant_tvNullVal;
vNullVal.vt=VT_NULL;
pXMLDoc->insertBefore(pXMLProc,vNullVal);
//創建根結點
_variant_tvarNodeType((short)MSXML2::NODE_ELEMENT);
MSXML2::IXMLDOMNodePtrpXMLNodeRoot=NULL;
pXMLNodeRoot=pXMLDoc->createNode(varNodeType,_T("Cases"),_T(""));
//添加根結點
pXMLDoc->appendChild(pXMLNodeRoot);
//創建並添加下級結點
MSXML2::IXMLDOMNodePtrpXMLNodeNode=NULL;
pXMLNodeNode=pXMLNodeRoot->appendChild(pXMLDoc->createElement(_T("Case")));
//創建下級元素結點
MSXML2::IXMLDOMElementPtrpXMLEle=NULL;
pXMLEle=pXMLDoc->createElement(_T("CopyFile"));
//創建並設置下級結點屬性
MSXML2::IXMLDOMAttributePtrpXMLAttr=NULL;
pXMLAttr=pXMLDoc->createAttribute(_T("src"));
pXMLAttr->nodeTypedValue="C:\test.txt";
pXMLEle->attributes->setNamedItem(pXMLAttr);
pXMLAttr=pXMLDoc->createAttribute(_T("dest"));
pXMLAttr->nodeTypedValue="D:\Test.txt";
pXMLEle->attributes->setNamedItem(pXMLAttr);
//添加元素結點
pXMLNodeNode->appendChild(pXMLEle);
MSXML2::IXMLDOMElementPtrpXMLEle1=NULL;
pXMLEle1=pXMLDoc->createElement(_T("DelFile"));
pXMLEle1->appendChild(pXMLDoc->createTextNode("C:\test.txt"));
//添加元素結點
pXMLNodeNode->appendChild(pXMLEle1);
//保存文檔
pXMLDoc->save(_T("d:\Test.xml"));
}
效果如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<Cases>
<Case>
<CopyFilesrc="C: est.txt"dest="D:Test.txt"/>
<DelFile>C: est.txt</DelFile>
</Case>
</Cases>
為了能夠讓MFC認識MSXML2,我們需要引入相應的dll,代碼如下;
#import "msxml4.dll"