繁体   English   中英

在python中处理yEd graphml文件

[英]Processing yEd graphml file in python

我想在 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', {})

图形的简单表示

我想你可以试试这个。

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

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

https://github.com/jamesscottbrown/pyyed

希望这可以帮助!

干杯!

在尝试了 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM