2013-07-28 2 views
0

Я пытаюсь прочитать .graphml, который генерирует yEd (yEd). Я могу читать простые и созданные вручную файлы .graphml, но файлы yEd содержат несколько свойств, которые нужно определить. Есть ли у кого-нибудь пример, который показывает, как работать с такими файлами yEd?Boost GraphML reader и yEd

+0

По существу основная проблема связана с расширениями yFiles, которые yEd вводит w.r.t. ванильный формат GraphML. Я не знаю, как позаботиться о yfiles.type в ''. – GDG

ответ

3

Файл yED должен быть отфильтрован, чтобы удалить все элементы yEd, которые boost :: read_graphml не распознает. Если все, что вам нужно, это вершины и ребра, это достаточно просто. Однако, если вы хотите некоторые из атрибутов, тогда он становится более сложным и будет зависеть от того, что вам нужно.

Вот какой код, который отфильтровывает все элементы yED, кроме текста меток узлов, который преобразуется в простейший возможный атрибут метки узла, который boost :: read_graphml может анализировать и хранить в связанном свойстве.

/** 

    Check for a yEd file 

    @param[in] n the filename 
    @return true if the file weas written by yED 

    The input file is copied to a new file graphex_processed.graphml 
    If the intput file was NOT produced by yEd, then the copy is perfect 
    If input was produced by yEd then the copy is filtered so that it can be 
    read by boost::read_graphml 
    Most of the yEd stuff is discarded, except for the node labels 
    the text of which are copied to a simple node attribute "label" 

*/ 

bool cGraph::IsGraphMLbyYED(const std::wstring& n) 
{ 
    bool yEd = false; 

    // open the input file 
    std::ifstream fin; 
    fin.open(n.c_str(), std::ifstream::in); 
    if(! fin.is_open()) { 
     return false; 
    } 
    // open the output file 
    std::ofstream fout; 
    fout.open("graphex_processed.graphml", std::ifstream::out); 
    if(! fout.is_open()) { 
     return false; 
    } 


    // loop over input file lines 
    fin.clear(); 
    char buf[1000]; 
    while(fin.good()) { 
     fin.getline(buf,999); 
     std::string l(buf); 

     // check for file produced by yEd 
     if(l.find("<!--Created by yFiles") != -1) { 
      yEd = true; 
      // convert NodeLabel text to simple label attribute 
      fout << "<key id=\"key0\" for=\"node\" attr.name=\"label\" attr.type=\"string\" />\n"; 
     } 

     // check for file already identified as yEd 
     if(yEd) { 

      // filter out yED attributes 
      if(l.find("<key") != -1) { 
       continue; 
      } 
      // convert NodeLabel text 
      if(l.find("<y:NodeLabel") != -1) { 
       int p = l.find(">")+1; 
       int q = l.find("<",p); 
       std::string label = l.substr(p,q-p); 
       fout << "<data key=\"key0\">" << label << "</data>\n"; 
       continue; 
      } 

      // filter out outher yEd stuff 
      if(l.find("<y:") != -1) { 
       continue; 
      } 
      if(l.find("</y:") != -1) { 
       continue; 
      } 
      if(l.find("<data") != -1) { 
       continue; 
      } 
      if(l.find("</data") != -1) { 
       continue; 
      } 
     } 
     // copy input line to output 
     fout << buf << std::endl; 
    } 

    // close files 
    fin.close(); 
    fout.close(); 

    // return true if yED file 
    return yEd; 

} 

Вот код для чтения отфильтрованного файла

void cGraph::ReadGraphML(const std::wstring& n) 
{ 
    // check if file was produced by yEd 
    IsGraphMLbyYED(n); 

    boost::dynamic_properties dp; 
    dp.property("label", boost::get(&cVertex::myName, myGraph)); 


    myGraph.clear(); 
    std::ifstream fin; 
    fin.open("graphex_processed.graphml", std::ifstream::in); 
    if(! fin.is_open()) { 
     return; 
    } 
    boost::read_graphml(fin, myGraph, dp); 
} 

Если вы хотите увидеть пример этого работает в приложении, посмотри на Graphex, графический интерфейс для BGL, который может читать файлы yEd, используя этот код.

 Смежные вопросы

  • Нет связанных вопросов^_^