Использование Boost для чтения и записи XML-файлов

Есть ли хороший способ (и простой способ) с помощью Boost для чтения и записи XML-файлов?

Я не могу найти простой образец для чтения XML-файлов с помощью Boost. Можете ли вы указать мне простой пример, который использует Boost для чтения и записи XML-файлов?

Если не Boost, есть ли хорошая и простая библиотека для чтения и записи XML-файлов, которые вы можете порекомендовать? (это должна быть библиотека C ++)

Вы должны попробовать 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; } 
  • Регулярное выражение \ p {L} и \ p {N}
  • Лучший способ кодирования текстовых данных для XML в Java?
  • Spring schemaLocation не удается, если нет подключения к Интернету
  • Специальный символ в запросе XPATH
  • Извлечь ссылки из файла Sitemap (xml)
  • XPath для выбора нескольких тегов
  • Получить N-й дочерний узел узла с помощью xpath
  • XSLT Transform XML с пространством имен
  • Как предоставить файлы данных для тестов на андроид
  • Сериализовать свойство как атрибут Xml в элементе
  • в чем разница между json и xml
  • Interesting Posts

    Материнская плата Gigabyte (890gpa-ud3h) не отключит питание USB

    XML-элемент с атрибутом и контентом с использованием JAXB

    Выборочно отключить предупреждения GCC только для части единицы перевода?

    C ++ наследует от нескольких базовых classов с тем же именем виртуальной функции

    Является ли значение Linq Count () более быстрым или медленным, чем List.Count или Array.Length?

    401 ответ на запрос CORS в IIS с включенным Windows Auth

    error: передача xxx как «этого» аргумента xxx отбрасывает квалификаторы

    Как включить область запроса в async task executor

    Активность Android ClassNotFoundException – все

    Как я могу изменить внешний вид терминала (Linux), когда я подключу SSH к удаленной машине?

    Какой процесс делает этот звук?

    Возвращать результаты анонимного типа?

    LINQ to Entities не распознает метод Int32 get_Item (Int32)

    Как я могу использовать SCP с удаленной машины на локальный компьютер, когда я вне своей домашней сети?

    Почему Disk Utility / diskutil занимает так много времени, чтобы обнулить данные?

    Давайте будем гением компьютера.