XML-Parser für C [closed]

Lesezeit: 5 Minuten

Können Sie einige der besten XML-Parser für C vorschlagen?

  • Definiere “am besten”. Am schnellsten? Am einfachsten zu verwenden (sicherlich libxml2)? Tragbarer? Am weitesten verbreitet?

    – Bortzmeyer

    1. Januar 2009 um 21:36 Uhr

Zwei Beispiele mit Expat und libxml2. Der zweite ist meiner Meinung nach viel einfacher zu verwenden, da er einen Baum im Speicher erstellt, eine Datenstruktur, mit der einfach zu arbeiten ist. expat hingegen baut nichts (Sie müssen es selbst tun), es erlaubt Ihnen nur, Handler bei bestimmten Ereignissen während des Parsens aufzurufen. Aber Expat kann schneller sein (ich habe nicht gemessen).

Mit expat eine XML-Datei lesen und die Elemente eingerückt anzeigen:

/* 
   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);
}

Mit libxml2, einem Programm, das den Namen des Wurzelelements und die Namen seiner Kinder anzeigt:

/*
   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;
}

  • +1 für gute Beispiele mit dem Befehl zum Kompilieren.

    – Promotion

    19. Oktober 2011 um 1:29 Uhr

  • für dein libxml2 Beispiel, ich denke, Sie sollten anrufen xmlFreeDoc(document); wenn Sie mit dem Parsen fertig sind.

    – Dobz

    18. August 2015 um 11:22 Uhr

  • musste ich einfach hinzufügen -lxml2 am Ende dieses Befehls, damit es funktioniert.

    – Fernando Basso

    23. Februar 2016 um 9:34 Uhr

  • Wie kompiliere ich dieses Programm? Ich erhalte einen undefinierten Referenzfehler für Funktionen in diesem Programm. Wie lautet der Befehl zum Ausführen dieses Programms …-> gcc -o Dateiname Dateiname.c -IC:\Users\admin\Desktop\Expat\Source\lib … ich erhalte einen undefinierten Referenzfehler …

    – Ashwant Manikoth

    8. August 2019 um 12:36 Uhr

Wie wäre es mit einem eingeschriebenen reiner Assembler 🙂 Vergessen Sie nicht, sich das anzuschauen Maßstäbe.

  • Schön, du gewinnst. 🙂

    – C. K. Young

    30. Dezember 2008 um 7:33 Uhr

  • Ein Großteil des Geschwindigkeitsfaktors kommt von der Tatsache, dass es nur eine Teilmenge von XML unterstützt, aber es sieht so aus, als ob es für viele Zwecke nützlich sein könnte. Sehr gepflegt.

    – Robert Gamble

    30. Dezember 2008 um 7:47 Uhr

  • Da ich es nicht benutzt habe, kann ich es nicht wirklich empfehlen, aber ich dachte, es wäre es wert, geteilt zu werden, da es eine C-API hat 🙂

    – Codelogik

    30. Dezember 2008 um 9:50 Uhr

  • Das sieht wirklich, WIRKLICH interessant für Aufgaben aus, bei denen das Schema und der Namensraum bekannt sind (dh RSS). Danke für den Link!!

    – Tim Post

    30. Dezember 2008 um 10:37 Uhr

  • Tipp: Ich hatte ein Problem, bei dem der Stamm meines Dokuments (ein Format, über das ich keine Kontrolle habe) ein Unterelement anstelle einer Sammlung direkt darunter enthielt, sodass es nicht mit dem Beispiel übereinstimmte, das der Autor in der Lernprogramm. Für eine solche Situation: AXParseContext context; ax_initializeParser(&context, 16384); AXElement* root = ax_parse(&context, xmlPtr, rootClass, 1); AXElement* first = (AXElement*) root->attributes[0].begin; Beachten Sie insbesondere die Verwendung von root->attributes[0].beginwas ein Zeiger auf eine ist AXElementNICHT root->firstChild wie im Tutorium.

    – Techniker

    7. Februar 2015 um 21:52 Uhr

Zwei der am häufigsten verwendeten Parser sind Expat und libxml.

Wenn Sie mit der Verwendung von C++ einverstanden sind, gibt es Xerces-C++ zu.

Benutzeravatar von Kasprzol
Kasprzol

Du kannst es versuchen ezxml — es ist ein leichtgewichtiger Parser, der vollständig in C geschrieben ist.

Für C++ können Sie auschecken TinyXML++

http://www.minixml.org ist auch ziemlich gut. Klein und nur ANSI C.

Benutzeravatar von Michael Foukarakis
Michael Foukarakis

Meine persönliche Vorliebe ist libxml2. Es ist sehr einfach zu bedienen, aber ich habe mir nie die Mühe gemacht, es zu testen, da ich es nur zum Analysieren von Konfigurationsdateien verwendet habe.

Benutzeravatar von Hank
Strang

Expat ist ziemlich anständig. Ohne weitere Informationen ist es jedoch schwierig, gute Empfehlungen zu geben.

1410670cookie-checkXML-Parser für C [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy