在python中处理yEd graphml文件

bel*_*oir 8 python graphml

我想在yEd创建的graphml文件中获取所有节点和一些属性(例如标签名称)的列表,而不管它们在图形中的位置.这与已经部分地处理(在蟒蛇networkx处理XML文件如何循环GraphML与LXML文件),但不是当内YED你"团"节点-和我有很多分组分组内.

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

例:

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

('n0', {})
('n1', {'y': '0.0', 'x': '26.007967509920633', 'label': 'A'})
('n0::n0', {})
('n0::n1', {})
Run Code Online (Sandbox Code Playgroud)

简单表示图形

小智 3

在尝试了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")
Run Code Online (Sandbox Code Playgroud)

然后你会得到这样的结果:

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()
Run Code Online (Sandbox Code Playgroud)

这应该能让你继续前进。您可以创建组、节点和边缘对象并使用它们进行某些处理。

我可能会开源我正在开发的库,因为它将用于比仅仅解析图表更大的目的。

在此输入图像描述

和输出:

 --- 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
Run Code Online (Sandbox Code Playgroud)