MTK內建的XML解析

來源:互聯網
上載者:User

現在大多數軟體都用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/
}
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.