MTK自帶的XML解析

MTK 自帶的 XML 解析

 

現在大多數軟件都用 xml 作爲配置文件, MTK 本身也帶了 XML 文件的解析,在此我不評說自帶 XML 的解析效率,我只是想說怎麼簡單的應用:

 

先給出一個簡單的 XML 文件的內容,我們以此文件爲例子來學習 MTk 平臺怎麼解析 XML 文件,不妨設文件名爲 sample.xml, 其內容如下:

<?xml version="1.0" encoding="utf-8" ?>

< l i =" 1 " d =" 240x320 " c =" 1 " a =" http://192.168.8.26:9090/ ">

      < t i =" 1 " d =" 美女 " c =" 2 ">

< g i =" g1 " n =" 自拍美女 " c =" 10 " e =" jpg ">

                 < s > 289 </ s >

                 < s > 467 </ s >

                 < s > 773 </ s >

                 < s > 030 </ s >

                 < s > 264 </ s >

                 < s > 889 </ s >

                 < s > 245 </ s >

                 < s > 300 </ s >

                 < s > 175 </ s >

                 < s > 777 </ s >

        </ g >

< g i =" g2 " n =" 泳裝美女 " c =" 10 " e =" jpg ">

                 < s > 514 </ s >

                 < s > 166 </ s >

                 < s > 506 </ s >

                 < s > 338 </ s >

                 < s > 390 </ s >

                 < s > 031 </ s >

                 < s > 012 </ s >

                 < s > 030 </ s >

                 < s > 030 </ s >

                 < s > 889 </ s >

        </ g >

  </ t >

</ l >

 

 

MTK 自帶的 XML 解析的函數聲明在 xml_def.h 中。其中幾個關鍵的是:

 

/* external API */

extern kal_int32 xml_new_parser(XML_PARSER_STRUCT *parser);

extern void xml_close_parser(XML_PARSER_STRUCT *parser);

extern void xml_register_element_handler(

                XML_PARSER_STRUCT *parser,

                XML_start_elem_hdlr start_hdlr,

                XML_end_elem_hdlr end_hdlr);

extern void xml_register_data_handler(XML_PARSER_STRUCT *parser, XML_data_hdlr data_hdlr);

 

extern kal_int32 xml_parse(XML_PARSER_STRUCT *parser, kal_wchar *file_name);

 

 

幾個關鍵的處理函數:

typedef void (*XML_start_elem_hdlr) (void *data, const kal_char *el, const kal_char **attr, kal_int32 error);

typedef void (*XML_end_elem_hdlr) (void *data, const kal_char *el, kal_int32 error);

typedef void (*XML_data_hdlr) (void *resv, const kal_char *el, const kal_char *data, kal_int32 len, kal_int32 error);

 

我們使用的方式如下:

         WCHAR filename[]=L” sample.xml”;

  首先定義一個 XML_PARSER_STRUCT   xml_app_parser

xml_new_parser(&xml_app_parser);

        

         // 註冊讀取 xml 內容的函數,爲的是將處理讀出來的 xml 內容 ( 默認的只是打印出來而已 )

xml_register_element_handler(&xml_app_parser,xml_app_read_start_element,xml_app_read_end_element);

    xml_register_data_handler(&xml_app_parser, xml_app_read_data_element);

        

    xml_parse(&xml_app_parser,(kal_wchar*) filename);

    xml_stop_parse(&xml_app_parser);// 釋放用於分析的 buffer 等資源

    xml_close_parser(&xml_app_parser);

 

 

void xml_app_read_start_element(void *no_used, const char *el, const char **attr, S32 error)

{

}

Void xml_app_read_end_element(void *data, const kal_char *el, kal_int32 error)

{

}

Void xml_app_read_data_element(void *resv, const kal_char *el, const kal_char *data, kal_int32 len, kal_int32 error)

{

}

對於 XML 的解析是一行一行的解析的,對於本例來說,當註冊了後,解析 xml, 當遇到 ”<” 號後會調用 xml_app_read_start_element ,將此行的內容讀到 attr 中,其中 el=” l”,atr 中是 l 標籤的屬性,其組織方式是 attr[0]=”i”,attr[1]=”1”; attr[2]=”d”,attr[3]=”240x320”; attr[4]=”c”,attr[5]=”1”;attr[6]=”a”,attr[7]=” http://192.168.8.26:9090/”; 你可以在此函數裏先一些對讀到的信息進行保存,等等你需要的操作,其第一個參數 void *no_used 是沒有使用的。

當讀到某一行是 /> 時就調用用戶註冊的標籤結束處理函數 xml_app_read_end_element ,其中的 data 沒有使用, el 是表示結束的標籤的名稱, error 是錯誤代碼,

讀取內容的是 xml_app_read_data_element ,它被調用的時機是在 <> 之外的內容,例如此例中的 <s>289</s>, 當在 > 符號後有內容時便調用 xml_app_read_data_element ,其參數表示:第一個 resv 是沒有使用, el 仍然是表示標籤的,比如此處是 s,data 中存儲的就是字符串 289 len 表示 data 的長度。

 

  此處我寫一個處理函數給大家參照下,比如我想讀取的是 l 標籤的 a 屬性和第一個 t 標籤下的第二組 g 下的第 3 s 的大小(此例是 506

則我們寫出如下的函數

Char netIp30];

void xml_app_read_start_element(void *no_used, const char *el, const char **attr, S32 error)

{

         If(!strcmp(el,”a”))// 標籤是 l

         {

                   Strcpy(netIp,attr[7]);// 獲取了 a 屬性的值 http://192.168.8.26:9090/

}

}

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章