inline void writeXGMMLFile( const G &g, const std::string &filename, const VV &vv, const EV &ev ) { using boost::format; std::ofstream file(filename); if(!file.good()) { throw GraphIOException(std::string("Could not open file: ") + filename); } file << "<?xml version=\"1.0\"?>\n"; if(g[boost::graph_bundle].label.size() > 0) { file << "<graph label=\"" << g[boost::graph_bundle].label << "\" "; } else { file << "<graph label=\"" << basename(filename) << "\" "; } file << "xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "; file << "xmlns:xlink=\"http://www.w3.org/1999/xlink\" "; file << "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "; file << "xmlns=\"http://www.cs.rpi.edu/XGMML\" "; file << "directed=\"0\">\n"; for(size_t i = 0; i < num_vertices(g); ++i) { file << format("\t<node id=\"%d\" label=\"%s\">\n") % (i+1) % g[i].label; for(size_t a = 0; a < vv.count(); ++a) { file << format("\t\t<att name=\"%s\" type=\"%s\" value=\"%s\"/>\n") % vv.name(a) % vv.type(a) % vv.value_str(g[i], a); } file << "\t</node>\n"; } for(size_t i = 0; i < num_vertices(g); ++i) { for(auto it = out_edges(i, g); it.first != it.second; ++it.first) { size_t j = target(*it.first, g); if(i <= j) { file << format("\t<edge source=\"%d\" target=\"%d\" label=\"%s\">\n") % (i+1) % (j+1) % g[*it.first].label; for(size_t a = 0; a < ev.count(); ++a) { file << format("\t\t<att name=\"%s\" type=\"%s\" value=\"%s\" />\n") % ev.name(a) % ev.type(a) % ev.value_str(g[*it.first], a); } file << "\t</edge>\n"; } } } file << "</graph>"; file.close(); }