Подтвердить что ты не робот

XML Parser для C

Можете ли вы предложить некоторые из лучших XML-парсеров для C?

4b9b3361

Ответ 1

Два из наиболее широко используемых парсеров: Expat и libxml.

Если вы используете С++, Xerces-С++.

Ответ 2

Два примера с expat и libxml2. Второй - это, IMHO, гораздо проще в использовании, поскольку он создает дерево в памяти, данные с которой легко работать. expat, с другой стороны, делает не строить ничего (вы должны сделать это сами), это просто позволяет вам обработчиков вызовов при определенных событиях во время разбора. Но expat может быть быстрее (я не измерял).

С expat, чтение XML файла и отображение отступов:

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

С libxml2, программой, которая отображает имя корневого элемента и имена его детей:

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

Ответ 4

Вы можете попробовать ezxml - это легкий парсер, полностью написанный на C.

Для С++ вы можете проверить TinyXML ++

Ответ 5

http://www.minixml.org тоже очень хорошо. Маленький и просто ANSI C.

Ответ 6

Expat довольно приличный. Трудно дать хорошие рекомендации без дополнительной информации.

Ответ 7

Не могли бы вы дать некоторое представление о том, на каких платформах вы пишете? Это должно сильно влиять на то, что "лучше". Вы можете найти супер-библиотеку xml-foo, которая по умолчанию не поставляется в большинстве систем по умолчанию.. в то время как ее большая нехватка библиотеки может помешать (или, по крайней мере) раздражать пользователей.

В основном, я использую libxml2.. потому что его стандартный или простой в установке на платформах, на которые я нацелен.

Как вы видите, "лучший" также определяется библиотекой, доступной на ваших целевых платформах.

Ответ 8

Мои личные предпочтения libxml2. Он очень прост в использовании, но я никогда не беспокоился об этом, поскольку я использовал его только для синтаксического анализа конфигурационных файлов.

Ответ 9

Для С++ я предлагаю использовать CMarkup.

Ответ 10

В Windows он является родным с Win32 api...