Обработка 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
Надеюсь это поможет!
Ура!