Код отлично работает с библиотекой rapidxml, но не тогда, когда я использую заголовочный файл boost1.51..rapidxml

Я пытаюсь научиться анализировать XML-данные (давным-давно работал в xerses), но наткнулся на rapidxml и увидел многообещающие результаты. Я скачал rapidxml с сайта sourceforge и получил пример кода из Интернета, и он работал нормально.

Но я узнал, что rapidxml также присутствует в библиотеке boost (я использую версию 1.51, и он присутствует в "boost/property_tree/detail/rapidxml.hpp" . Я запускаю тот же код, за исключением того, что я даю правильный путь для boost и пространства имен. Но бинарный сбой. Я отладил его и увидел, что при обходе узлов, первой итерации для вызова next_sibling(), узел не указывает правильно. Я не уверен, почему он ведет себя странно. Нужна помощь, если кто-то сталкивался с такой же проблемой. Любое предложение будет полезно.

Вот код.

#include <string.h>
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include "boost/property_tree/detail/rapidxml.hpp"

using namespace boost::property_tree::detail::rapidxml;
using namespace std;

int main(void)
{
    cout << "Parsing my beer journal..." << endl;
    xml_document<> doc;
    xml_node<> * root_node;
    // Read the xml file into a vector
    ifstream theFile ("beerJournal.xml");
    std::stringstream buffer;
    buffer << theFile.rdbuf();
    theFile.close();
    string content(buffer.str());
    // Parse the buffer using the xml file parsing library into doc 
    doc.parse<0>(&content[0]);
    // Find our root node
    root_node = doc.first_node("MyBeerJournal");
    // Iterate over the brewerys
    for (xml_node<> * brewery_node = root_node->first_node("Brewery"); brewery_node; brewery_node = brewery_node->next_sibling())
    {   
        printf("I have visited %s in %s. ", 
            brewery_node->first_attribute("name")->value(),
            brewery_node->first_attribute("location")->value());
            // Interate over the beers
        for(xml_node<> * beer_node = brewery_node->first_node("Beer"); beer_node; beer_node = beer_node->next_sibling())
        {   
            printf("On %s, I tried their %s which is a %s. ", 
                beer_node->first_attribute("dateSampled")->value(),
                beer_node->first_attribute("name")->value(), 
                beer_node->first_attribute("description")->value());
            printf("I gave it the following review: %s", beer_node->value());
        }   
        cout << endl;
    }   
}

И входной файл выглядит следующим образом, имя файла "beerJournal.xml"

<?xml version="1.0" encoding="utf-8"?>
<MyBeerJournal>
    <Brewery name="Founders Brewing Company" location="Grand Rapids, MI">
        <Beer name="Centennial" description="IPA" rating="A+" dateSampled="01/02/2011">
            "What an excellent IPA. This is the most delicious beer I have ever tasted!"
        </Beer>
    </Brewery>
    <Brewery name="Brewery Vivant" location="Grand Rapids, MI">
        <Beer name="Farmhouse Ale" description="Belgian Ale" rating="B" dateSampled="02/07/2015">
            This beer is not so good... but I am not that big of a fan of english style ales.
        </Beer>
    </Brewery>
    <Brewery name="Bells Brewery" location="Kalamazoo, MI">
        <Beer name="Two Hearted Ale" description="IPA" rating="A" dateSampled="03/15/2012">
            Another execllent brew. Two Hearted gives Founders Centennial a run for it's money.
        </Beer>
    </Brewery>
</MyBeerJournal>

Сбой кода выглядел так:

Parsing my beer journal...
I have visited Founders Brewing Company in Grand Rapids, MI. On 01/02/2011, I tried their Centennial which is a IPA. I gave it the following review: 
            "What an excellent IPA. This is the most delicious beer I have ever tasted!"

Segmentation fault

0 ответов

Другие вопросы по тегам