Serialize graph G in GraphML to the stream.
(self, G)
| 750 | self.add_graph_element(graph) |
| 751 | |
| 752 | def add_graph_element(self, G): |
| 753 | """ |
| 754 | Serialize graph G in GraphML to the stream. |
| 755 | """ |
| 756 | if G.is_directed(): |
| 757 | default_edge_type = "directed" |
| 758 | else: |
| 759 | default_edge_type = "undirected" |
| 760 | |
| 761 | graphid = G.graph.pop("id", None) |
| 762 | if graphid is None: |
| 763 | graph_element = self._xml.element("graph", edgedefault=default_edge_type) |
| 764 | else: |
| 765 | graph_element = self._xml.element( |
| 766 | "graph", edgedefault=default_edge_type, id=graphid |
| 767 | ) |
| 768 | |
| 769 | # gather attributes types for the whole graph |
| 770 | # to find the most general numeric format needed. |
| 771 | # Then pass through attributes to create key_id for each. |
| 772 | graphdata = { |
| 773 | k: v |
| 774 | for k, v in G.graph.items() |
| 775 | if k not in ("node_default", "edge_default") |
| 776 | } |
| 777 | node_default = G.graph.get("node_default", {}) |
| 778 | edge_default = G.graph.get("edge_default", {}) |
| 779 | # Graph attributes |
| 780 | for k, v in graphdata.items(): |
| 781 | self.attribute_types[(str(k), "graph")].add(type(v)) |
| 782 | for k, v in graphdata.items(): |
| 783 | element_type = self.get_xml_type(self.attr_type(k, "graph", v)) |
| 784 | self.get_key(str(k), element_type, "graph", None) |
| 785 | # Nodes and data |
| 786 | for node, d in G.nodes.items(): |
| 787 | for k, v in d.items(): |
| 788 | self.attribute_types[(str(k), "node")].add(type(v)) |
| 789 | for node, d in G.nodes.items(): |
| 790 | for k, v in d.items(): |
| 791 | T = self.get_xml_type(self.attr_type(k, "node", v)) |
| 792 | self.get_key(str(k), T, "node", node_default.get(k)) |
| 793 | # Edges and data |
| 794 | if G.is_multigraph(): |
| 795 | for u, v, ekey, d in G.edges: |
| 796 | for k, v in d.items(): |
| 797 | self.attribute_types[(str(k), "edge")].add(type(v)) |
| 798 | for u, v, ekey, d in G.edges: |
| 799 | for k, v in d.items(): |
| 800 | T = self.get_xml_type(self.attr_type(k, "edge", v)) |
| 801 | self.get_key(str(k), T, "edge", edge_default.get(k)) |
| 802 | else: |
| 803 | for u, v, d in G.edges: |
| 804 | for k, v in d.items(): |
| 805 | self.attribute_types[(str(k), "edge")].add(type(v)) |
| 806 | for u, v, d in G.edges: |
| 807 | for k, v in d.items(): |
| 808 | T = self.get_xml_type(self.attr_type(k, "edge", v)) |
| 809 | self.get_key(str(k), T, "edge", edge_default.get(k)) |
no test coverage detected