Использование Boost для чтения и записи XML-файлов
Есть ли хороший способ (и простой способ) с помощью Boost для чтения и записи XML-файлов?
Я не могу найти простой образец для чтения XML-файлов с помощью Boost. Можете ли вы указать мне простой пример, который использует Boost для чтения и записи XML-файлов?
Если не Boost, есть ли хорошая и простая библиотека для чтения и записи XML-файлов, которые вы можете порекомендовать? (это должна быть библиотека C ++)
- JAXB: как отобразить карту в значение
- XPathSelectElement всегда возвращает null
- Scripting: что проще всего извлечь значение в теге XML-файла?
- Xml пространство имен, разбивающее мой xpath!
- Какой лучший синтаксический анализатор XML для Perl?
- Можно ли использовать динамическое выражение xPath в таблице стилей xslt?
- В чем разница между .// и // * в XPath?
- Преобразование XDocument в XmlDocument и наоборот
- Добавление существующего XML-файла с помощью XmlWriter
- Создание XML-файла с использованием XDocument в C #
- Как просмотреть AndroidManifest.xml из файла APK?
- Для чего нужны пространства имен XML?
- Что означает в XML?
Вы должны попробовать pugixml Легкий, простой и быстрый XML-синтаксический анализатор для C ++
Самое приятное в pugixml – поддержка XPath , которой не хватает TinyXML и RapidXML.
Цитата автора RapidXML «Я хотел бы поблагодарить Арсения Капулкина за его работу над pugixml, которая была вдохновением для этого проекта» и «на 5% – на 30% быстрее, чем pugixml, самый быстрый парсер XML, который я знаю о« Он тестировал против версии 0.3 pugixml, который достиг недавно версии 0.42.
Вот выдержка из документации pugixml:
Основные возможности:
- низкое потребление памяти и fragmentация (выигрыш над pugxml ~ 1,3 раза, TinyXML – ~ 2,5 раза, Xerces (DOM) – ~ 4,3 раза 1). Точные числа можно увидеть в разделе Сравнение с существующими параграфами.
- чрезвычайно высокая скорость parsingа (выигрыш над pugxml ~ 6 раз, TinyXML – ~ 10 раз, Xerces-DOM – ~ 17,6 раза 1
- чрезвычайно высокая скорость синтаксического анализа (ну, я повторяюсь, но это так быстро, что он превосходит Expat в 2.8 раза на тестовом XML) 2
- более или менее стандартно-совместимый (он будет правильно разбирать любой стандартный файл, за исключением проблем, связанных с DTD)
- в значительной степени игнорируется ошибка (он не задохнется от чего-то вроде You & Me, как exat, будет анализировать файлы с данными в неправильном кодировании и т. д.),
- чистый интерфейс (сильно рефакторизованный pugxml’s)
- более или менее Unicode-совместимый (на самом деле он предполагает кодирование UTF-8 входных данных, хотя он будет легко работать с ANSI – без UTF-16 на данный момент (см. «Будущая работа»), с вспомогательными функциями преобразования (UTF-8 <- > UTF-16/32 (независимо от значения по умолчанию для std :: wstring & wchar_t))
- полностью совместимый с C ++ код (одобрен строгим режимом Комо); библиотека является мультиплатформенной (см. ссылку для списка платформ)
- высокая гибкость. Вы можете управлять многими аспектами parsingа файлов и построения дерева DOM с помощью параметров синтаксического анализа.
Ладно, спросите вы – что за улов? Все так мило – это небольшое, быстрое, надежное и чистое решение для синтаксического анализа XML. Чего не хватает? Хорошо, мы честные разработчики – вот список недостойных:
- потребление памяти. Он превосходит каждый парсер, основанный на DOM, о котором я знаю, но когда приходит парсер SAX, шансов нет. Вы не можете обработать XML-файл размером 2 ГБ с объемом памяти менее 4 ГБ – и сделать это быстро. Хотя pugixml ведет себя лучше, чем любой другой парсер, основанный на DOM, поэтому, если вы застряли с DOM, это не проблема.
- потребление памяти. Хорошо, я повторяюсь. Еще раз. Когда другие синтаксические анализаторы позволят вам предоставить XML-файл в постоянном хранилище (или даже в виде области с отображением памяти), pugixml не будет. Таким образом, вам придется скопировать все данные в непостоянное хранилище. Более того, он должен сохраняться во время жизни парсера (причины этого и многое другое о сроках жизни написано ниже). Опять же, если вы в порядке с DOM – это не должно быть проблемой, потому что общее потребление памяти меньше (ну, хотя вам понадобится непрерывный кусок памяти, что может быть проблемой).
- отсутствие валидации, обработка DTD, пространства имен XML, правильная обработка кодировки. Если вам это нужно – займитесь MSXML или XercesC или что-нибудь в этом роде.
TinyXML , вероятно, хороший выбор. Что касается Boost:
В репозитории Boost имеется библиотека Property_Tree . Это было принято, но на данный момент поддержки пока не хватает (EDIT: Property_Tree теперь входит в Boost с версии 1.41 , читает документацию о ее функциональности XML).
Daniel Nuffer реализовал XML-парсер для Boost Spirit.
Там также TinyXML , который является красивой и небольшой библиотекой C ++. Если вы ищете библиотеку более низкого уровня, RapidXML – отличная отправная точка.
Boost использует RapidXML, как описано в главе XML Parser на странице Как заполнить дерево свойств :
К сожалению, в Boost на момент написания этой статьи отсутствует синтаксический анализатор XML в Boost . Поэтому библиотека содержит быстрый и крошечный парсер RapidXML (в настоящее время в версии 1.13), чтобы обеспечить поддержку синтаксического анализа XML. RapidXML не полностью поддерживает стандарт XML; он не способен анализировать DTD и поэтому не может выполнять полную замену сущности.
Также обратитесь к учебному курсу XML boost .
Поскольку OP хочет «простой способ использовать boost для чтения и записи xml-файлов» , я приведу ниже очень простой пример:
Matt Scarface Max Moose Snowball Powerball Miss Pudge Needlenose Sweety Pie Peacey Funnyface
(имена кошек указаны на главной странице Matt Mahoney )
Соответствующая структура в C ++:
struct Catowner { std::string owner; std::set cats; };
read_xml()
:
#include #include Catowner load(const std::string &file) { boost::property_tree::ptree pt; read_xml(file, pt); Catowner co; co.owner = pt.get("main.owner"); BOOST_FOREACH( boost::property_tree::ptree::value_type &v, pt.get_child("main.cats")) co.cats.insert(v.second.data()); return co; }
write_xml()
:
void save(const Catowner &co, const std::string &file) { boost::property_tree::ptree pt; pt.put("main.owner", co.owner); BOOST_FOREACH( const std::string &name, co.cats) pt.add("main.cats.cat", name); write_xml(file, pt); }
Ну, нет никакой конкретной библиотеки в boost для parsingа XML, но есть много альтернатив, вот пара: libxml , Xerces , Expat
Конечно, вы могли бы использовать некоторые из других библиотек в boost, чтобы помочь вам в создании собственной библиотеки, но это, вероятно, будет серьезной задачей.
И вот целая статья по этому вопросу от IBM.
Boost не предоставляет синтаксический анализатор XML.
Poco XML (часть Poco C ++ libs ) хорош и прост.
Похоже, что упрощенная сериализация может читать и записывать в архивы в XML, если этого достаточно для ваших целей.
Легкий XML с Boost
Определенно используйте TinyXML * thumbs up *
Взгляните на Arabica
Если вы ищете только функцию DOM, в этом streamе есть предложения. Я лично, вероятно, не потрудился бы с библиотекой, не имеющей поддержки XPath, и на C ++ использовал Qt. Там также TinyXPath, и Arabica утверждает, что имеет поддержку XPath, но я ничего не могу сказать о них.
Из моих опытов, скрывающихся в списке рассылки Boost, кажется, что каждый раз, когда XML появляется в качестве темы, он отвлекается на обсуждение Unicode. Однако, поскольку в настоящее время существует потенциальная библиотека Unicode, я не думаю, что для библиотеки XML появится слишком много времени.
Тем временем я тоже использовал TinyXML.
Интересная ссылка о RapidXML. Я посмотрю на это.
Предупреждение. Мне нравится RapidXML, но при parsingе UTF16 у него очень неприятная ошибка. Некоторые допустимые значения приводят к сбою.
Мне бы хотелось порекомендовать pugixml – но ему не хватает поддержки пространства имен, которое, как я знаю, вызовет у меня проблемы.
Существует предлагаемая GSoC работа по улучшению существующего предложения Boost.XML: https://github.com/stefanseefeld/boost.xml, но поскольку Анджей предложил Boost.PropertyTree, это хорошо для этой задачи. В зависимости от размера xml и необходимой поддержки валидации.
Существует также библиотека, которая недавно была предложена в списке рассылки Boost: http://www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml
Как насчет boost.spirit?
Здесь они показывают парсер « Mini XML »
4 7 9 454 47 29 String A String B
Существует простой способ читать XML с помощью BOOST. В этом примере используется std :: wstring:
#include #include #include #include bool CMyClass::ReadXML(std::wstring &full_path) { using boost::property_tree::wptree; // Populate tree structure pt: wptree pt; std::wstringstream ss; ss << load_text_file(full_path); // See below for ref. read_xml(ss, pt); // Traverse pt: BOOST_FOREACH(wptree::value_type const& v, pt.get_child(L"Settings")) { if (v.first == L"GroupA") { unsigned int n1 = v.second.get(L"One"); unsigned int n2 = v.second.get (L"Two"); unsigned int n3= v.second.get (L"Three"); } else if (v.first == L"GroupB") { std::wstring wstrA = v.second.get(L"A"); std::wstring wstrB = v.second.get (L"B"); } }; }
Читать атрибуты немного сложнее.
–
Только для справки:
std::wstring load_text_file(std::wstring &full_path) { std::wifstream wif(full_path); wif.seekg(0, std::ios::end); buffer.resize(wif.tellg()); wif.seekg(0); wif.read(buffer.data(), buffer.size()); return buffer; }