Я пытаюсь загрузить простой файл GraphML, чтобы каждая вершина имела имя вершины, хранящееся в GraphML. Я могу изменить GraphML, главное, чтобы впоследствии у меня был доступ к vertex_name из кода.
Вот самый минимальный пример, который я смог извлечь, который все еще показывает проблему:
#include <iostream>
#include <string>
#include <fstream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphml.hpp>
int main()
{
using namespace boost;
typedef adjacency_list<vecS, vecS, directedS,property<vertex_name_t,std::string> > BoostGraphType;
typedef dynamic_properties BoostDynamicProperties;
std::string fn = "simple.graphml";
std::ifstream is(fn.c_str());
if (!is.is_open())
{
std::cout << "loading file '" << fn << "'failed." << std::endl;
throw "Could not load file.";
}
BoostGraphType g;
BoostDynamicProperties dp ;
const std::string vn = "vertex_name";
dp.property(vn,get(vertex_name,g));
read_graphml(is, g, dp);
for (auto vp = vertices(g); vp.first != vp.second; ++vp.first)
{
std::cout << "index '" << get(vertex_index,g,*vp.first) << "' ";
std::cout << "name '" << get(vertex_name,g,*vp.first) << "'"
<< std::endl;
}
return 0;
}
Я использую следующий тестовый файл GraphML:
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key id="d0" for="node" attr.name="vertex_name" attr.type="string"/>
<graph id="G" edgedefault="directed">
<node id="A"> <data key="d0">A</data> </node>
<node id="B"> <data key="d0">B</data> </node>
<edge id="0" source="A" target="B"/>
</graph>
</graphml>
read_graphml выдает исключение с полезным сообщением (e.what()):
parse error: unrecognized type "
Кажется, проблема связана с ассоциацией vertex_name (которую я получил из комментария к предыдущий мой вопрос).
если я удалю
<data key="d0">A</data>
с узла работает.
Однако мне нужно иметь возможность идентифицировать вершины по vertex_name.
Как я могу это исправить, чтобы он правильно анализировал graphml и не выбрасывал? Что я делаю неправильно?