10

我想在 yEd 创建的 graphml 文件中获取所有节点和一些属性(例如标签名称)的列表,而不管它们在图中的位置。这已经部分处理了(在 python 中使用 networkx 处理 XML 文件如何使用 lxml 迭代 GraphML 文件),但是当您在 yEd 中“分组”节点时没有 - 而且我在分组中有很多分组。

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

例子:

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

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

图的简单表示

4

2 回答 2

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

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

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

这应该让你继续前进。您可以制作组、节点和边缘对象并将它们用于某些处理。

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

在此处输入图像描述

和输出:

 --- 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
于 2015-11-22T11:22:35.303 回答
3

我想你可以试试这个。

根据作者的说法,它是一个 Python 库...

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

https://github.com/jamesscottbrown/pyyed

希望这可以帮助!

干杯!

于 2019-09-04T12:44:51.797 回答