C++中使用Expat解析XML

來源:互聯網
上載者:User

本文介紹expat 解析xml的基本方法,如果你希望用最輕量的解析器,請選擇TinyXML,它更簡單。

使用expat的原因很多,主要還是因為expat更靈活。習慣了TinyXML,一開始不太習慣expat,分析一下,其實很容易上手的。

 

1.回呼函數

以下案例解析xml檔案中的elment,attribute和text。expat使用回調方式返回xml資料,解析器解析到一個element及其內部屬性後,將調用事先設定好的函數,同樣,當element結束和text結束後,也會分別調用對應的函數。

 

2.如何處理資料之間的內含項目關聯性

典型的方式是定義三個函數分別處理elment開始(含屬性)、element結束和常值內容。回呼函數的第一個參數是自訂的,通常用於儲存XML文檔的上下文資訊,用XML_SetUserData可以設定這個參數,下例中傳遞一個整數指標,以便在每次回調時能知道該元素是第幾層元素。

該參數也可以是一個棧對象的地址,開始一個元素時,將新元素對應的資料壓入堆棧,處理下一級元素時,新元素是棧頂元素在子項目,然後處理完了繼續把該元素壓入堆棧,繼續下一級新的子項目。當元素結束後,需要出棧,以便解析下個兄弟元素程時能取到父節點。

好啦,基本應用還是很簡單的,實際上Expat的API函數不多。

 

3.如何處理屬性

屬性通過ElementHandler回呼函數傳入,這裡有一個char** atts就是屬性,這是一個字元指標數組,如果有N個屬性,數組大小就是2*N+1,最後一個素組元素為空白指標,奇數指標對應屬性名稱,偶數指標對應屬性值(字串格式)。可以在一個迴圈中處理多個屬性,當遇到null 指標時,表示沒有更多屬性了。

 

好啦,先看sample吧:

 

#include <stdio.h>
#include "expat.h"


#pragma warning(disable:4996)


#define XML_FMT_INT_MOD "l"

static void XMLCALL startElement(void *userData, const char *name, const char **atts)
{
int i;
int *depthPtr = (int *)userData;
for (i = 0; i < *depthPtr; i++)
printf(" ");


printf(name);

*depthPtr += 1;

for(i=0;atts[i]!=0;i+=2)
{
printf(" %s=%s",atts[i],atts[i+1]);
}

printf("\n");
}

static void XMLCALL endElement(void *userData, const char *name)
{
int *depthPtr = (int *)userData;
*depthPtr -= 1;
}

int main(int argc, char *argv[])
{
char buf[BUFSIZ]; XML_Parser parser = XML_ParserCreate(NULL);

int done; int depth = 0;

XML_SetUserData(parser, &depth);

XML_SetElementHandler(parser, startElement, endElement);

FILE* pFile= argc<2 ?stdin : fopen(argv[1],"rb");

do
{ int len = (int)fread(buf, 1, sizeof(buf), pFile);
done = len < sizeof(buf);

if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR)
{
fprintf(stderr,"%s at line %" XML_FMT_INT_MOD "u\n",
XML_ErrorString(XML_GetErrorCode(parser)),
XML_GetCurrentLineNumber(parser));
return 1;
}
}
while (!done);
XML_ParserFree(parser);
fclose(pFile);
return 0;
}

 

4.其他ElementHanlder

expat還可以設定CData,Comment的handler,另外一些函數本人還沒使用過,涉及到更多的xml標準的知識,如果需要,可以參考官方的手冊。 

參考:

http://www.xml.com/pub/a/1999/09/expat/index.html 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.