c / c ++ XML библиотека вопрос - PullRequest
0 голосов
/ 11 октября 2009

Я знаю, что уже задавалось много вопросов по библиотеке C / C ++ XML (я пытался прочитать их все, прежде чем приступить к этому).

Вот вещи, которые мне понадобятся в моем собственном проекте:

  • Отличная производительность
  • SAX2
  • Проверка
  • Открытый исходный код
  • Кроссплатформенный

Я собирался использовать Xerces-C, но я вижу, что простая установка SAX2, в которой ничего не происходит в фильтре, занимает 5 секунд. (Может, я здесь что-то не так делаю?)

Я хотел бы использовать libxml ++, но когда я попытался настроить его на своем MacBook, возникли некоторые сумасшедшие зависимости, которые вернули меня обратно к gtk-doc, и в этот момент я как бы выдвинул идею.

Так что теперь я нахожусь на libxml2. Это путь? Я пропустил важный вариант, учитывая пять требований выше? Я не против использовать (хорошую) c-библиотеку, такую ​​как libxml2, но интерфейс c ++ был бы неплох. (Мне не очень нравится API Xerces-C.)

Я готов отклониться от требования SAX2, если доступны сопоставимые функции.

Ответы [ 4 ]

2 голосов
/ 11 октября 2009

Потратив довольно много времени на эту же проблему, я пришел к выводу, что libxml2 - лучший вариант, доступный в соответствии с вашими рекомендациями. Интерфейс C не слишком сложен в использовании и очень быстр.

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

1 голос
/ 11 октября 2009

Вы говорите, что вам нужны эти вещи в вашем проекте, но не даете никакого представления о конвейере. Например, у нас была целая загрузка статических XML-файлов, которые нужно было загружать быстро, но проверять их было редко. Таким образом, проверено использование отдельного процесса в пакетном режиме (с использованием RelaxNG, так как это была разметка, удобная для записи человеком) и загрузка XML с использованием expat. Система также использовала XMPP, поэтому проверяла потоковый ввод, но для этого не требовалась проверка по схеме (отчасти потому, что она была потоковой, и в основном потому, что большинство возможных ошибок не были выражены в схеме).

0 голосов
/ 01 марта 2018

Я создал библиотеку синтаксического анализа пула XML C ++ 11 (например, Java StAX). Вы можете найти его на https://github.com/incoder1/IO.

Пример для чтения XML в структуру POCO.

XML:

<?xml version="1.0" encoding="UTF-8"?>
<configurations>
    <configuration id="0" enabled="true">
        <name>Test configuration <![CDATA[<0>]]></name>
    </configuration>
    <configuration id="1" enabled="false">
        <name>Test configuration <![CDATA[<1>]]></name>
    </configuration>
</configurations>

И код чтения для структуры вроде:

/// A structure to parse into
struct configuration
{
    std::size_t id;
    bool enabled;
    std::string name;
};

Функция чтения (десериализации кода)

static configuration read_config(io::unsafe<io::xml::reader>& rd) {
    configuration ret;
    io::xml::start_element_event bev = rd.next_tag_begin();
        // read id from attribute
        io::const_string tmp = bev.get_attribute("id").first;
        ret.id = size_t_cast::from_string( tmp.data() );
        tmp = bev.get_attribute("enabled").first;
        ret.enabled = bool_cast::from_string( tmp.data() );
        // read name value from tag
        bev = rd.next_tag_begin();
          ret.name = std::string( rd.next_characters().data() );
        rd.next_tag_end();
    // goto </configuration>
    rd.next_tag_end();
    return ret;
}

Полный пример можно найти по адресу https://github.com/incoder1/IO/tree/master/examples/xml_read

Более сложный пример для Java StAX-подобных баз событий. Анализатор XML можно найти по адресу: https://github.com/incoder1/IO/tree/master/examples/xmlparse

Библиотека нуждается в значке iconv (в POSIX / Unix, например, в ОС, например GNU / Linux, FreeBSD, MacOSX, она включена в libc) и, возможно, в gnutls. GnuTLS предназначен для минимальной поддержки сети и его можно избежать при разборе XML. Библиотека протестирована с GCC 5+ (GNU / Linux и MinGW64) и MS VC ++ 15. + в Windows (Windows 7, Windows 10) и GNU / Linux (Fedora 23, Fedora 26)

В отличие от синтаксических анализаторов C SAX, libxml2 IO - это библиотека C ++, которая также не основана на обратном вызове. В отличие от Apache Xerces исключения и RTI могут быть отключены оба. В отличие от TinyXML, POCO и т. Д. Нет поддержки DOM

Анализатор проверяет только синтаксис XML. Проверка схемы XML через XSD или DTD еще не выполнена.

Спасибо.

0 голосов
/ 11 октября 2009

Если вам нужен целый ряд других средств, вы можете рассмотреть Qt, который имеет хорошую поддержку XML. Имейте в виду, что это ПУТЬ больше, чем библиотека обработки XML; это полноценная прикладная среда с поддержкой графического интерфейса, сетей и множества других вещей.

Qt

Вы также можете попробовать Poco. Это еще одна прикладная среда, но не такая огромная, как Qt (т.е. никаких вещей, связанных с GUI и т. Д.)

Poco

Наконец, если вы не возражаете против библиотеки C, вы можете использовать Expat. Это не SAX как таковой, но написание кода с использованием Expat чем-то похоже на SAX. У него есть обертки C ++, но они официально не являются частью проекта IIRC и, возможно, не так хорошо поддерживаются или спроектированы. Я не слишком уверен, хотя.

Expat

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Я неправильно прочитал ваш оригинальный пост: не слишком уверен насчет функций проверки этих библиотек, я никогда не использовал их раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...