Source code for GraphMLParser

#-*- coding: utf-8 -*-

from xml.dom import minidom

from Graph import *
from Node import *
from Edge import *

[docs]class GraphMLParser: """ """ def __init__(self): """ """
[docs] def write(self, graph, fname): """ """ doc = minidom.Document() root = doc.createElement('graphml') doc.appendChild(root) # Add attributs for a in graph.get_attributs(): attr_node = doc.createElement('key') attr_node.setAttribute('id', a.name) attr_node.setAttribute('attr.name', a.name) attr_node.setAttribute('attr.type', 'string') root.appendChild(attr_node) graph_node = doc.createElement('graph') graph_node.setAttribute('id', graph.name) if graph.directed: graph_node.setAttribute('edgedefault', 'directed') else: graph_node.setAttribute('edgedefault', 'undirected') root.appendChild(graph_node) # Add nodes for n in graph.nodes(): node = doc.createElement('node') node.setAttribute('id', n['label']) for a in n.attributes(): if a != 'label': data = doc.createElement('data') data.setAttribute('key', a) data.appendChild(doc.createTextNode(str(n[a]))) node.appendChild(data) graph_node.appendChild(node) for e in graph.edges(): edge = doc.createElement('edge') edge.setAttribute('source', e.node1['label']) edge.setAttribute('target', e.node2['label']) for a in e.attributes(): if e != 'label': data = doc.createElement('data') data.setAttribute('key', a) data.appendChild(doc.createTextNode(e[a])) node.appendChild(data) graph_node.appendChild(edge) f = open(fname, 'w') f.write(doc.toprettyxml(indent = ' '))
[docs] def parse(self, fname): """ """ dom = minidom.parse(open(fname, 'r')) root = dom.getElementsByTagName("graphml")[0] graph = root.getElementsByTagName("graph")[0] name = graph.getAttribute('id') g = Graph(name) # # Get attributes # attributes = [] # for attr in root.getElementsByTagName("key"): # attributes.append(attr) # Get nodes for node in graph.getElementsByTagName("node"): n = g.add_node(node.getAttribute('id')) for attr in node.getElementsByTagName("data"): if attr.firstChild: n[attr.getAttribute("key")] = attr.firstChild.data else: n[attr.getAttribute("key")] = "" # Get edges for edge in graph.getElementsByTagName("edge"): source = edge.getAttribute('source') dest = edge.getAttribute('target') e = g.add_edge_by_label(source, dest) for attr in edge.getElementsByTagName("data"): if attr.firstChild: e[attr.getAttribute("key")] = attr.firstChild.data else: e[attr.getAttribute("key")] = "" return g
if __name__ == '__main__': parser = GraphMLParser() g = parser.parse('test.graphml') g.show(True)