0
|
1 __author__ = "Yasunobu OKAMURA"
|
|
2 __copyright__ = "Copyright (c) 2012 Y.Okamura"
|
|
3 __license__ = "GPL v3+"
|
|
4
|
|
5 import xml.parsers.expat
|
|
6 import networkx as nx
|
|
7
|
|
8 class XGMMLParserHelper(object):
|
|
9 """
|
|
10 """
|
|
11
|
|
12 def __init__(self, graph=nx.DiGraph()):
|
|
13 """
|
|
14
|
|
15 Arguments:
|
|
16 - `graph`: Network X graph object
|
|
17 """
|
|
18 self._graph = graph
|
|
19 self._parser = xml.parsers.expat.ParserCreate()
|
|
20 self._parser.StartElementHandler = self._start_element
|
|
21 self._parser.EndElementHandler = self._end_element
|
|
22 self._tagstack = list()
|
|
23
|
|
24 self._current_attr = dict()
|
|
25 self._current_obj = dict()
|
|
26
|
|
27 def _start_element(self, tag, attr):
|
|
28 """
|
|
29
|
|
30 Arguments:
|
|
31 - `self`:
|
|
32 - `tag`:
|
|
33 - `attr`:
|
|
34 """
|
|
35
|
|
36 self._tagstack.append(tag)
|
|
37
|
|
38 if tag == 'node' or tag == 'edge':
|
|
39 self._current_obj = dict(attr)
|
|
40
|
|
41 if tag == 'att' and (self._tagstack[-2] == 'node' or self._tagstack[-2] == 'edge'):
|
|
42 if attr['type'] == 'string':
|
|
43 self._current_attr[attr['name']] = attr['value']
|
|
44 elif attr['type'] == 'real':
|
|
45 self._current_attr[attr['name']] = float(attr['value'])
|
|
46 elif attr['type'] == 'integer':
|
|
47 self._current_attr[attr['name']] = int(attr['value'])
|
|
48 elif attr['type'] == 'boolean':
|
|
49 self._current_attr[attr['name']] = bool(attr['value'])
|
|
50 else:
|
|
51 raise NotImplementedError(attr['type'])
|
|
52
|
|
53 def _end_element(self, tag):
|
|
54 """
|
|
55
|
|
56 Arguments:
|
|
57 - `self`:
|
|
58 - `tag`:
|
|
59 """
|
|
60
|
|
61 if tag == 'node':
|
|
62 self._graph.add_node(self._current_obj['id'], label=self._current_obj['label'], **self._current_attr)
|
|
63 #print 'add node', self._current_obj
|
|
64 elif tag == 'edge':
|
|
65 self._graph.add_edge(self._current_obj['source'], self._current_obj['target'], **self._current_attr)
|
|
66
|
|
67 self._tagstack.pop()
|
|
68
|
|
69 def parseFile(self, file):
|
|
70 """
|
|
71
|
|
72 Arguments:
|
|
73 - `self`:
|
|
74 - `file`:
|
|
75 """
|
|
76
|
|
77 self._parser.ParseFile(file)
|
|
78
|
|
79 def graph(self):
|
|
80 """
|
|
81
|
|
82 Arguments:
|
|
83 - `self`:
|
|
84 """
|
|
85
|
|
86 return self._graph
|
|
87
|
|
88 def XGMMLWriter(file, graph, graph_name):
|
|
89 """
|
|
90
|
|
91 Arguments:
|
|
92 - `graph`:
|
|
93 """
|
|
94
|
|
95 print >>file, """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
96 <graph directed="1" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.cs.rpi.edu/XGMML">
|
|
97 <att name="selected" value="1" type="boolean" />
|
|
98 <att name="name" value="{0}" type="string"/>
|
|
99 <att name="shared name" value="{0}" type="string"/>
|
|
100 """.format(graph_name)
|
|
101
|
|
102
|
|
103 for onenode in graph.nodes(data=True):
|
|
104 id = onenode[0]
|
|
105 attr = dict(onenode[1])
|
|
106
|
|
107 if 'label' in attr:
|
|
108 label = attr['label']
|
|
109 del attr['label']
|
|
110 else:
|
|
111 label = id
|
|
112
|
|
113 print >>file, '<node id="{id}" label="{label}">'.format(id=id, label=label)
|
|
114 for k, v in attr.iteritems():
|
|
115 print >>file, '<att name="{}" value="{}" type="string" />'.format(k, v)
|
|
116 print >>file, '</node>'
|
|
117
|
|
118 for oneedge in graph.edges(data=True):
|
|
119 print >>file, '<edge source="{}" target="{}">'.format(oneedge[0], oneedge[1])
|
|
120 for k, v in oneedge[2].iteritems():
|
|
121 print >>file, '<att name="{}" value="{}" type="string" />'.format(k, v)
|
|
122 print >>file, '</edge>'
|
|
123 print >>file, '</graph>'
|
|
124
|