Использование vertex_name при чтении файла GraphML с помощью Boost Graph

Я пытаюсь загрузить простой файл 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 и не выбрасывал? Что я делаю неправильно?


person Wilbert    schedule 21.05.2013    source источник
comment
Попробуйте это на базовом примере GraphML из Википедии - en.wikipedia.org/wiki/GraphML. Вы узнаете, связана ли ошибка с искаженным файлом.   -  person SChepurin    schedule 21.05.2013
comment
Я думаю, что проблема частично связана с неправильно сформированным файлом, но я не могу понять, что именно я делаю неправильно. Я обновил вопрос.   -  person Wilbert    schedule 21.05.2013


Ответы (1)


Ваш код отлично работает, когда я его запускаю.

>wilbert.exe
index '0' name 'A'
index '1' name 'B'

Это использует boost v1.52 на Windows 7

person ravenspoint    schedule 26.06.2013
comment
Я попробовал это на Windows, используя boost 1.53. Какую ОС и Boost вы используете? - person Wilbert; 01.07.2013