2010-10-18 37 views
3

我有一段時間弄清楚如何使用libxml2的sax解析器。有人可以張貼解析這個XML爲例(是的,沒有<xml...>頁眉和頁腳的標籤,如果能由libxml2的SAX解析器解析):請求完整的,可編譯的libxml2 sax示例

<hello foo="bar">world</hello> 

的分析器會打印出包含在元素hello數據並獲取屬性foo的值。

我正在研究這個例子,但是希望別人能夠擊敗我,因爲我沒有取得太大的進步。 Google尚未爲libxml2 sax解析器提供任何完整的工作示例。

+1

http://stackoverflow.com/問題/ 982716/libxml2-sax-parsing-and-ampersand – DumbCoder 2010-10-18 14:42:39

+0

http://www.xmlsoft.org/exam ples/index.html#reader1.c – DumbCoder 2010-10-18 14:43:39

+0

感謝您的鏈接。我認爲規範的Hello World仍然非常有用。我還需要從文件而不是內存解析。我在法國網站上發現了一個,我正在嘗試使其適用於在最新版本的ubuntu中找到的libxml2的當前版本。 – 2010-10-18 16:58:03

回答

3

http://julp.developpez.com/c/libxml2/?page=sax

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <libxml/tree.h> 
#include <libxml/parser.h> 
#include <libxml/parserInternals.h> 


void start_element_callback(void *user_data, const xmlChar *name, const xmlChar **attrs) { 
    printf("Beginning of element : %s \n", name); 
    while (NULL != attrs && NULL != attrs[0]) { 
    printf("attribute: %s=%s\n",attrs[0],attrs[1]); 
    attrs = &attrs[2]; 
    } 
} 

int main() { 
    const char* xml_path = "hello_world.xml"; 
    FILE *xml_fh = fopen(xml_path,"w+"); 
    fputs("<hello foo=\"bar\" baz=\"baa\">world</hello>",xml_fh); 
    fclose(xml_fh); 


    // Initialize all fields to zero 
    xmlSAXHandler sh = { 0 }; 

    // register callback 
    sh.startElement = start_element_callback; 

    xmlParserCtxtPtr ctxt; 

    // create the context 
    if ((ctxt = xmlCreateFileParserCtxt(xml_path)) == NULL) { 
    fprintf(stderr, "Erreur lors de la création du contexte\n"); 
    return EXIT_FAILURE; 
    } 
    // register sax handler with the context 
    ctxt->sax = &sh; 

    // parse the doc 
    xmlParseDocument(ctxt); 
    // well-formed document? 
    if (ctxt->wellFormed) { 
    printf("XML Document is well formed\n"); 
    } else { 
    fprintf(stderr, "XML Document isn't well formed\n"); 
    //xmlFreeParserCtxt(ctxt); 
    return EXIT_FAILURE; 
    } 

    // free the memory 
    // xmlFreeParserCtxt(ctxt); 


    return EXIT_SUCCESS; 
} 

改編這將產生輸出:

Beginning of element : hello 
attribute: foo=bar 
attribute: baz=baa 
XML Document is well formed 

編譯在Ubuntu 10.04.1以下命令:

g++ -I/usr/include/libxml2 libxml2_hello_world.cpp /usr/lib/libxml2.a -lz\ 
    -o libxml2_hello_world 
0

我可以建議rapidxml

+0

我不會被允許在我的項目中創建一個新的依賴項,我需要做的最小解析不能保證爲新的依賴項而戰。 (還是)感謝你的建議。 – 2010-10-18 16:58:54