diff options
Diffstat (limited to 'lib/Graph/GEXF/Role/XML.pm')
| -rw-r--r-- | lib/Graph/GEXF/Role/XML.pm | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/Graph/GEXF/Role/XML.pm b/lib/Graph/GEXF/Role/XML.pm new file mode 100644 index 0000000..c157d45 --- /dev/null +++ b/lib/Graph/GEXF/Role/XML.pm @@ -0,0 +1,67 @@ +package Graph::GEXF::Role::XML; + +use Moose::Role; + +use XML::Simple; + +has gexf_ns => + (is => 'ro', isa => 'Str', default => 'http://www.gexf.net/1.1draft'); + +has gexf_version => (is => 'ro', isa => 'Num', default => '1.1'); + +sub to_xml { + my $self = shift; + + my $graph = { + gexf => { + xmlns => $self->gexf_ns, + version => $self->gexf_version, + meta => {creator => ['Graph::GEXF']}, + graph => { + mode => $self->graph_mode, + defaultedgetype => $self->edge_type, + } + } + }; + + foreach my $attr_id ($self->attributes_node_list) { + my $attribute = $self->get_node_attribute($attr_id); + $graph->{gexf}->{graph}->{attributes}->{class} = 'node'; + push @{$graph->{gexf}->{graph}->{attributes}->{attribute}}, + { id => $attribute->{id}, + type => $attribute->{type}, + title => $attribute->{title}, + }; + } + + my $edges_id = 0; + + foreach my $node_id ($self->all_nodes) { + my $node = $self->get_node($node_id); + my $node_desc = { + id => $node->id, + label => $node->label, + }; + + foreach my $attr_id ($node->attributes_node_list) { + my $attr = $node->get_node_attribute($attr_id); + push @{$node_desc->{attvalues}->{attvalue}}, {for => $attr->{id}, value => $attr->{value}}; + } + + push @{$graph->{gexf}->{graph}->{nodes}->{node}}, $node_desc; + + foreach my $edge_id ($node->all_edges) { + my $edge = $node->get_edge($edge_id); + push @{$graph->{gexf}->{graph}->{edges}->{edge}}, + { id => $edges_id, + source => $edge->source, + target => $edge->target + }; + } + } + + my $xml_out = XMLout($graph, AttrIndent => 1, keepRoot => 1); + $xml_out; +} + +1; |
