2010-10-18 3 views
3

Je me demande comment utiliser l'analyseur de sax pour libxml2. Quelqu'un peut-il afficher un exemple qui parse ce XML (oui, sans les balises d'en-tête et pied de page <xml...>, si cela peut être analysé par l'analyseur de sax libxml2):Demande d'un exemple complet et compilable de sax libxml2

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

L'analyseur doit imprimer les données incluses dans l'élément hello et également saisir la valeur de l'attribut foo.

Je travaille sur cet exemple, mais en espérant que quelqu'un d'autre me batte au punch car je ne progresse pas beaucoup. Google n'a fourni aucun exemple de travail complet pour libxml2 sax parser.

+1

http://stackoverflow.com/ questions/982716/libxml2-sax-parsing-et-ampersand – DumbCoder

+0

http://www.xmlsoft.org/exam ples/index.html # reader1.c – DumbCoder

+0

Merci pour les liens. Je pense qu'un Hello World canonique serait encore très utile. J'ai également besoin d'analyser à partir d'un fichier au lieu de la mémoire. J'en ai trouvé un sur un site français et j'essaie de l'adapter pour fonctionner avec la version actuelle de libxml2 telle que trouvée dans la dernière version d'ubuntu. –

Répondre

3

Adapté de 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; 
} 

Ceci produit une sortie:

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

compilé avec la commande suivante sur Ubuntu 10.04.1:

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

Puis-je suggérer rapidxml?

+0

Je ne vais pas être autorisé à créer une nouvelle dépendance dans mon projet et l'analyse minimale que je dois faire ne justifie pas de se battre pour une nouvelle dépendance. Merci pour la suggestion cependant. –

Questions connexes