Nano Hash - криптовалюты, майнинг, программирование

парсинг xml с помощью boost

Я анализирую XML-файл ниже, используя библиотеку BOOST-

<da>
        <m_day Type="int">15</m_day>
        <m_month Type="int">8</m_month>
        <m_year Type="int">1947</m_year>
</da>

Мой код cpp:

    #include <boost/archive/xml_oarchive.hpp> 
    #include <boost/archive/xml_iarchive.hpp>
    #include <iostream> 
    #include <fstream> 

    typedef struct date { 
        unsigned int m_day;
        unsigned int m_month;
        unsigned int m_year;
        date( int d,  int m,  int y) : m_day(d), m_month(m), m_year(y) 
        {}
        date() : m_day(1), m_month(1), m_year(2000) 
        {}
        friend std::ostream& operator << (std::ostream& out, date& d) 
        {
            out << "day: " << d.m_day 
                  << " month: " << d.m_month
        << " year: " << d.m_year;
            return out;
        }
        template<class Archive>
        void serialize(Archive& archive, const unsigned int version)
        {
        archive & BOOST_SERIALIZATION_NVP(m_day);
            archive & BOOST_SERIALIZATION_NVP(m_month);
            archive & BOOST_SERIALIZATION_NVP(m_year);
        }
    } date;

    BOOST_CLASS_IMPLEMENTATION(date, boost::serialization::object_serializable);//object_serializable);

    unsigned int flags =   boost::archive::no_header;


    int main()
    {

     std::ifstream file1("archive.xml");
     boost::archive::xml_iarchive ia(file1,flags);
     date dr;
     ia >> BOOST_SERIALIZATION_NVP(dr);


     std::ofstream file("archive2.xml");
      boost::archive::xml_oarchive oa(file,flags);
    //  date da(15, 8, 1947);
      oa & BOOST_SERIALIZATION_NVP(dr);


    return 0;
    }

Я получаю ошибку ниже:

завершение вызывается после создания экземпляра 'boost::archive::archive_exception' what(): ошибка входного потока Прервано (дамп ядра)

для обычного xml без атрибутов (как указано ниже) приведенный выше код работает нормально

<da>
        <m_day>15</m_day>
        <m_month>8</m_month>
        <m_year>1947</m_year>
</da>

Но для предыдущего файла xml есть ли проблема в коде? не могли бы вы сообщить мне, возможно ли это с boost. Я так много искал, чтобы найти ответ, но не смог его получить. Заранее спасибо !!!

20.01.2015

  • Это не может работать, потому что ваш документ не является архивом сериализации. Формат не является бесплатным для Boost Serialization. 20.01.2015

Ответы:


1

Boost Serialization — это не XML-библиотека.

Boost Archive xml_[io]archive также не является библиотекой XML.

Черт возьми, даже Boost Property Tree не является библиотекой XML.

Вкратце: Boost не содержит XML-библиотеки.


Чуть дольше: вы можете использовать Boost Property Tree для анализа вашего XML. Под капотом используется производная от RapidXML, и вы можете читать/записывать достаточно общие XML-документы с помощью Boost Property Tree.

На самом деле интерфейс Дерева свойств довольно специфичен и часто приводит к путанице. Там не так много контроля.

Если вам важна поддержка XML (пространства имен? Пробелы? Порядок? PCDATA? Инструкции по обработке? XPath? Кодировки?...), рассмотрите возможность использования библиотеки XML (Какой анализатор XML следует использовать в C++?)

Бонус: пример с деревом свойств Boost

Вот как это сделать с деревом свойств Boost

Прямой эфир на Coliru

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

typedef struct date { 
    unsigned int m_day;
    unsigned int m_month;
    unsigned int m_year;
    date( int d=1,  int m=1,  int y=2000) : m_day(d), m_month(m), m_year(y) {}

    friend std::ostream& operator << (std::ostream& out, date& d) {
        return out << "day: " << d.m_day << " month: " << d.m_month << " year: " << d.m_year;
    }

    void load(boost::property_tree::ptree const& pt)
    {
        m_day = pt.get("da.m_day", 1);
        m_month = pt.get("da.m_month", 1);
        m_year = pt.get("da.m_year", 2000);
    }
} date;

#include <sstream>

int main() {
    std::istringstream iss("<da>\n"
                "<m_day Type=\"int\">15</m_day>\n"
                "<m_month Type=\"int\">8</m_month>\n"
                "<m_year Type=\"int\">1947</m_year>\n"
                "</da>\n");

    boost::property_tree::ptree pt;
    read_xml(iss, pt);

    date d;
    d.load(pt);

    std::cout << d << "\n";
}

Отпечатки

day: 15 month: 8 year: 1947
20.01.2015
  • Добавлен пример кода, основанный на дереве свойств Boost (не хочу быть циничным :)) 20.01.2015
  • На самом деле мое требование - десериализовать xml, поместить его в struc на стороне и отправить на другую сторону. С другой стороны, я сериализую данные из этой структуры обратно и сформирую XML. Вот почему я использую Boost Serialization. Не могли бы вы предоставить решение с сериализацией Boost вместо дерева свойств Boost. Спасибо в Advacne 20.01.2015
  • @harshini Вы упустили суть. Вы не можете. Нет, если вы не можете изменить XML (или хотите реализовать для этой цели совершенно новый xml-архив). Это совершенно другой вопрос (он полностью перевернут), и, на мой взгляд, вы должны задать его как новый вопрос. 20.01.2015
  • @harshini Привет. Без проблем. Ответ, к сожалению, не меняется. 20.01.2015
  • Извините за неясность с моим объяснением выше. На самом деле требование состоит в том, чтобы десериализовать данные из XML и поместить их в объект с помощью библиотеки повышения и отправить их. На принимающей стороне этот объект должен быть сериализован в xml-файл. На отправляющей и принимающей стороне xml должен быть одинаковым. Пример xml такой же, как указано выше. Не могли бы вы предоставить решение с сериализацией Boost вместо дерева свойств Boost. заранее спасибо 20.01.2015
  • @harshini Я сейчас в замешательстве. Повторение вопроса не меняет ответ. Дело не в том, что я не хочу. Это просто не то, что делает библиотека. 20.01.2015

  • 2

    Boost Serialization не поддерживает запись XML-атрибутов и, по-видимому, не поддерживает их чтение или даже игнорирование. Один из авторов написал об этом здесь: http://boost.2283326.n4.nabble.com/serialization-How-to-serialize-as-an-XML-attribute-td2557918.html

    Вы можете предварительно обработать XML перед его загрузкой, используя другую XML-библиотеку, например Expat или что-то еще.

    20.01.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..