在python中处理yEd graphml文件

时间:2014-12-15 15:48:58

标签: python graphml

我想在yEd创建的graphml文件中获取所有节点列表和一些属性(例如标签名称),无论它们在图表中的位置如何。已经部分处理了这个问题(Processing XML file with networkx in pythonHow to iterate over GraphML file with lxml),但是当你在yEd中“分组”节点时 - 我在分组中有很多分组。

尝试过netx和lxml,但没有使用建议的简单方法获得完整的结果集 - 任何关于优雅解决方法的建议以及使用哪个库不能递归迭代树并识别组节点并再次向下钻取。

示例:

当您有分组时,使用networkx的非常简单的图表的示例输出:

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

Simple representation of the graph

2 个答案:

答案 0 :(得分: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&边缘对象并将它们用于某些处理。

我可以开源我正在处理的库,因为它将用于更大的目的,而不仅仅是解析图形。

enter image description here

输出:

 --- 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

答案 1 :(得分:0)

我认为您可以尝试一下。

根据作者的描述,这是一个Python库...

  

提供了一个简单的界面,可让您指定图形的显示方式   外观,并生成可以在yEd中打开的相应graphML。

https://github.com/jamesscottbrown/pyyed

希望这会有所帮助!

干杯!