Обработка yEd graphml файла в python

Я хочу получить список всех узлов и некоторых атрибутов (например, имя метки) в файле graphml, созданном yEd, независимо от того, где они расположены на графике. Это уже было частично решено ( Обработка XML-файла с помощью networkx в python и Как перебрать файл GraphML с помощью lxml), но не тогда, когда вы "группируете" узлы в yEd - и у меня много группировок внутри группировок.

Пробовал networkx и lxml, но не получал полный набор результатов, используя предложенные простые подходы - любые предложения по элегантному способу решения и какую библиотеку использовать, если не считать рекурсивных итераций по дереву и идентификации узлов группы и повторной детализации.

Пример:

Пример вывода для очень простого графика с использованием networkx, когда у вас есть группировки:

('n0', {})
('n1', {'y': '0.0', 'x': '26.007967509920633', 'label': 'A'})
('n0::n0', {})
('n0::n1', {})

Простое представление графика

1 ответ

Попробовав networkx, lxml и pygraphml, я решил, что они вообще не будут выполнять эту работу. Я использую BeautifulSoup и пишу все с нуля:

from bs4 import BeautifulSoup

fp = "files/tes.graphml"

with open(fp) as file:
    soup = BeautifulSoup(file, "lxml")

    nodes = soup.findAll("node", {"yfiles.foldertype":""})
    groups = soup.find_all("node", {"yfiles.foldertype":"group"})
    edges = soup.findAll("edge")

Тогда вы получите свои результаты, как это:

print " --- Groups --- "
for group in groups:
    print group['id']
    print group.find("y:nodelabel").text.strip()

print " --- Nodes --- "
for node in nodes:
    print node['id']
    print node.find("y:nodelabel").text.strip()

Это должно помочь вам. Вы можете создавать объекты Group, Node & Edge и использовать их для некоторой обработки.

Я могу открыть исходный код библиотеки, над которой я работаю, так как она будет использоваться для большей цели, чем просто анализ графиков.

И вывод:

 --- Groups --- 
n0 / SimpleApp
 --- Nodes --- 
n0::n0 / main
n0::n1 / say hello
n1 / Exit
 --- Edges --- 
n0::e0 / n0::n0 / n0::n1 / str:username, int:age
e0 / n0::n1 / n1 / None

Думаю, ты можешь попробовать это.

Это библиотека Python, которая, по словам автора...

предоставляет простой интерфейс, который позволяет указать, как должен выглядеть график, и генерирует соответствующий graphML, который можно открыть в yEd.

https://github.com/jamesscottbrown/pyyed

Надеюсь это поможет!

Ура!

Другие вопросы по тегам