Boost Read_graphml не читает xml правильно, он выдает все вершины, но они пусты

У меня есть список смежности типа

boost::adjacency_list<boost::setS, boost::vecS, boost::directedS, GraphData>

Где GraphData является структурой, содержащей имя

struct GraphItem
{
std::string Name;
}

Я могу написать график в XML

void WriteGraph() {
boost::dynamic_properties dp;

dp.property("Name", make_transform_value_property_map(&Name,
boost::get(vertex_bundle, graph)));

boost::write_graphml(filename, graph, dp, true);
}

std::string Name(boost::vertex_bundle_type<Graph>::type v) {
std::ostringstream oss;
oss << v.Name;
return oss.str();
}

Я получаю XML как

<graphml>
<key id="key0" for="node" attr.name="Name" attr.type="string" />
<graph id="G" edgedefault="directed" parse.nodeids="canonical"parse.edgeids="canonical" parse.order="nodesfirst">
<node id="n0">
<data key="key0">A</data>
</node>
<node id="n1">
<data key="key0">D</data>
</node>
<node id="n2">
<data key="key0">B</data>
</node>
<node id="n3">
<data key="key0">C</data>
</node>
<edge id="e0" source="n0" target="n1">
</edge>
<edge id="e1" source="n2" target="n3">
</edge>
</graph>
</graphml>

Когда я читаю график

void ReadGraph() {
boost::dynamic_properties dp;
std::ifstream file(fileName);
boost::read_graphml(file, graph, dp);
}

Это сбой говорит, что свойство Name не найдено.
Если я использую ignore_other_properties для собственности,

boost::dynamic_properties dp(ignore_other_properties);

Это работает, но я не получаю какой-либо элемент графа в вершинах графа.

1

Решение

График не пустой, вы получите:

0 --> 1
1 -->
2 --> 3
3 -->

Или в XML: https://paste.ubuntu.com/p/c4tGmxGssJ/

Конечно, вы хотели прочитать имя свойства. Для этого вам, очевидно, необходимо зарегистрировать свойство с картой динамических свойств.

Заметка Вы можете получить доступ к членам пакетов свойств гораздо проще:

    dp.property("Name", boost::get(&GraphData::Name, graph));

Полная демонстрация

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphml.hpp>

struct GraphData {
std::string Name;
};

using Graph = boost::adjacency_list<boost::setS, boost::vecS, boost::directedS, GraphData>;

Graph ReadGraph(std::string const& fileName) {
Graph graph;
boost::dynamic_properties dp;
dp.property("Name", boost::get(&GraphData::Name, graph));

std::ifstream file(fileName);
boost::read_graphml(file, graph, dp);

return graph;
}

void WriteGraph(std::ostream& os, Graph& graph) {
boost::dynamic_properties dp;
dp.property("Name", get(&GraphData::Name, graph));

boost::write_graphml(os, graph, dp, true);
}

#include <boost/graph/graph_utility.hpp>

int main() {
Graph g = ReadGraph("input.txt");
print_graph(g, get(&GraphData::Name, g));

// or as XML
WriteGraph(std::cout << "==== XML version: ====\n\n", g);
}

Печать

A --> D
D -->
B --> C
C -->
==== XML version: ====

<?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="key0" for="node" attr.name="Name" attr.type="string" />
<graph id="G" edgedefault="directed" parse.nodeids="canonical" parse.edgeids="canonical" parse.order="nodesfirst">
<node id="n0">
<data key="key0">A</data>
</node>
<node id="n1">
<data key="key0">D</data>
</node>
<node id="n2">
<data key="key0">B</data>
</node>
<node id="n3">
<data key="key0">C</data>
</node>
<edge id="e0" source="n0" target="n1">
</edge>
<edge id="e1" source="n2" target="n3">
</edge>
</graph>
</graphml>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]