46 votes

Analyseur XML pour C

Pouvez-vous suggérer certains des meilleurs analyseurs XML pour C?

67voto

bortzmeyer Points 12246

Deux exemples avec des expatriés et libxml2. La seconde est À mon humble avis, beaucoup plus facile à utiliser car il crée un arbre en mémoire de données la structure qui est facile à travailler avec. expat, d'autre part, ne ne pas construire quoi que ce soit (vous devez le faire vous-même), il permet simplement de les gestionnaires d'appel à des événements spécifiques lors de l'analyse. Mais expatrié peut être plus rapide (je n'ai pas de mesure).

Avec les expatriés, à la lecture d'un fichier XML et d'afficher les éléments en retrait:

/* 
   A simple test program to parse XML documents with expat
   <http://expat.sourceforge.net/>. It just displays the element
   names.

   On Debian, compile with:

   gcc -Wall -o expat-test -lexpat expat-test.c  

   Inspired from <http://www.xml.com/pub/a/1999/09/expat/index.html> 
*/

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

/* Keep track of the current level in the XML tree */
int             Depth;

#define MAXCHARS 1000000

void
start(void *data, const char *el, const char **attr)
{
    int             i;

    for (i = 0; i < Depth; i++)
    	printf("  ");

    printf("%s", el);

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

    printf("\n");
    Depth++;
}   			/* End of start handler */

void
end(void *data, const char *el)
{
    Depth--;
}   			/* End of end handler */

int
main(int argc, char **argv)
{

    char           *filename;
    FILE           *f;
    size_t          size;
    char           *xmltext;
    XML_Parser      parser;

    if (argc != 2) {
    	fprintf(stderr, "Usage: %s filename\n", argv[0]);
    	return (1);
    }
    filename = argv[1];
    parser = XML_ParserCreate(NULL);
    if (parser == NULL) {
    	fprintf(stderr, "Parser not created\n");
    	return (1);
    }
    /* Tell expat to use functions start() and end() each times it encounters
     * the start or end of an element. */
    XML_SetElementHandler(parser, start, end);
    f = fopen(filename, "r");
    xmltext = malloc(MAXCHARS);
    /* Slurp the XML file in the buffer xmltext */
    size = fread(xmltext, sizeof(char), MAXCHARS, f);
    if (XML_Parse(parser, xmltext, strlen(xmltext), XML_TRUE) ==
        XML_STATUS_ERROR) {
    	fprintf(stderr,
    		"Cannot parse %s, file may be too large or not well-formed XML\n",
    		filename);
    	return (1);
    }
    fclose(f);
    XML_ParserFree(parser);
    fprintf(stdout, "Successfully parsed %i characters in file %s\n", size,
    	filename);
    return (0);
}

Avec libxml2, un programme qui affiche le nom de l'élément racine et les noms de ses enfants:

/*
   Simple test with libxml2 <http://xmlsoft.org>. It displays the name
   of the root element and the names of all its children (not
   descendents, just children).

   On Debian, compiles with:
   gcc -Wall -o read-xml2 $(xml2-config --cflags) $(xml2-config --libs) \
                    read-xml2.c    

*/

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>

int
main(int argc, char **argv)
{
    xmlDoc         *document;
    xmlNode        *root, *first_child, *node;
    char           *filename;

    if (argc < 2) {
    	fprintf(stderr, "Usage: %s filename.xml\n", argv[0]);
    	return 1;
    }
    filename = argv[1];

    document = xmlReadFile(filename, NULL, 0);
    root = xmlDocGetRootElement(document);
    fprintf(stdout, "Root is <%s> (%i)\n", root->name, root->type);
    first_child = root->children;
    for (node = first_child; node; node = node->next) {
    	fprintf(stdout, "\t Child is <%s> (%i)\n", node->name, node->type);
    }
    fprintf(stdout, "...\n");
    return 0;
}

39voto

codelogic Points 22722

Que pensez vous d'un écrit en assembleur pur :-) N'oubliez pas de vérifier les critères de référence.

39voto

Chris Jester-Young Points 102876

Deux des plus largement utilisé des analyseurs sont des Expatriés et libxml.

Si vous êtes d'accord avec l'aide de C++, il y a Xerces-C++ aussi.

9voto

Kasprzol Points 2954

Vous pouvez essayer de ezxml -- c'est un léger analyseur entièrement écrit en C.

Pour C++, vous pouvez consulter la TinyXML++

7voto

singpolyma Points 5586

http://www.minixml.org est également très bon. Les petites et juste c ANSI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X