Код отлично работает с библиотекой 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