Синтаксический анализатор XML для [закрытого] C

Хотя это работает только для скалярных массивов (см. примечание ниже), оно короткое:

array1.length === array2.length && array1.every(function(value, index) { return value === array2[index]})

Rr, в ECMAScript 6 / CoffeeScript / TypeScript со стрелочными функциями:

array1.length === array2.length && array1.every((value, index) => value === array2[index])

(Примечание: здесь «скаляр» означает значения, которые можно напрямую сравнивать с помощью ===. Итак: числа, строки, объекты по ссылке, функции по ссылке. Подробнее см. в ссылке MDN для получения дополнительной информации о операторах сравнения).

UPDATE

Из того, что я прочитал из комментариев, сортировка массива и сравнение могут дать точный результат:

array1.length === array2.length && array1.sort().every(function(value, index) { return value === array2.sort()[index]});

Например :

array1 = [2,3,1,4];
array2 = [1,2,3,4];

Тогда приведенный выше код даст true

45
задан coder 30 December 2008 в 07:15
поделиться

9 ответов

Два из наиболее широко используемых синтаксических анализаторов Эмигрант и libxml.

, Если Вы хорошо с использованием C++, существует Xerces-C++ также.

38
ответ дан Chris Jester-Young 8 November 2019 в 00:36
поделиться

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

С эмигрантом, читая 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;
}
67
ответ дан bortzmeyer 8 November 2019 в 00:36
поделиться

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

Для C++ можно проверить TinyXML ++

9
ответ дан Michael Gaskill 8 November 2019 в 00:36
поделиться

Как насчет одного записанного в чистый ассемблер :-), не забывают проверять сравнительные тесты .

39
ответ дан codelogic 8 November 2019 в 00:36
поделиться

Эмигрант довольно достоин. Трудно дать хорошие рекомендации без большей информации все же.

2
ответ дан Hank 8 November 2019 в 00:36
поделиться

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

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

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

2
ответ дан Tim Post 8 November 2019 в 00:36
поделиться

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

7
ответ дан singpolyma 8 November 2019 в 00:36
поделиться

В Windows это является собственным с API Win32...

0
ответ дан 8 November 2019 в 00:36
поделиться

Я предпочитаю libxml2 . Он очень прост в использовании, но я никогда не беспокоился о его тестировании, поскольку я использовал его только для анализа файла конфигурации.

4
ответ дан 26 November 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: