Skip to content
This repository has been archived by the owner on Oct 8, 2021. It is now read-only.

Commit

Permalink
Merge pull request #39 from jiahao/cjh/read_graphml
Browse files Browse the repository at this point in the history
Provide read_graphml
  • Loading branch information
sbromberger committed Apr 4, 2015
2 parents 19be9c7 + 0828e9e commit 14b1ef5
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/LightGraphs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ module LightGraphs
a_star,

# persistence
readgraph,
readgraph, read_graphml,

# randgraphs
erdos_renyi, watts_strogatz
Expand Down
80 changes: 80 additions & 0 deletions src/persistence.jl
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,83 @@ function write(
close(f)
return res
end



_HAS_LIGHTXML = try
using LightXML
true
catch
false
end

if _HAS_LIGHTXML

#@doc """
#Reads in a GraphML file as an array of Graphs or Digraphs
#
#Input:
#
# filename
#
#Returns:
#
# An array of (name, AbstractGraph) tuple
#""" ->
function read_graphml(filename::String)
xdoc = parse_file(filename)
xroot = root(xdoc) # an instance of XMLElement
name(xroot) == "graphml" || error("Not a GraphML file")

# traverse all its child nodes and print element names
graphs = (String, AbstractGraph)[]
for c in child_nodes(xroot) # c is an instance of XMLNode
if is_elementnode(c)
e = XMLElement(c) # this makes an XMLElement instance
if name(e) == "graph"
nodes = Dict{String,Int}()
edges = (Int, Int)[]
graphname = has_attribute(e, "id") ? attribute(e, "id") : nothing
edgedefault = attribute(e, "edgedefault")
isdirected = edgedefault=="directed" ? true :
edgedefault=="undirected" ? false : error("Unknown value of edgedefault: $edgedefault")
else
error("Unknown node $(name(e))")
end

nodeid = 1
for f in child_elements(e)
if name(f) == "node"
nodes[attribute(f, "id")] = nodeid
nodeid += 1
elseif name(f) == "edge"
n1 = attribute(f, "source")
n2 = attribute(f, "target")
push!(edges, (nodes[n1], nodes[n2]))
else
error("Unknown node $(name(f))")
end
end
#Put data in graph
g = (isdirected ? DiGraph : Graph)(length(nodes))
for (n1, n2) in edges
add_edge!(g, n1, n2)
end
push!(graphs, (graphname, g))
end
end
graphs
end

else

#@doc """
#Reads in a GraphML file as an array of Graphs or Digraphs
#
#Requires the LightXML package to be insta.
#""" ->
function read_graphml(filename::String)
error("needs LightXML")
end

end
35 changes: 35 additions & 0 deletions test/data/grafo1853.13.graphml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file was written by the internal XML-Handler of Y-Files.-->
<!DOCTYPE graphml SYSTEM "http://www.graphdrawing.org/dtds/graphml.dtd">
<graphml>
<graph edgedefault="undirected" id="G">
<node id="n0"/>
<node id="n1"/>
<node id="n2"/>
<node id="n3"/>
<node id="n4"/>
<node id="n5"/>
<node id="n6"/>
<node id="n7"/>
<node id="n8"/>
<node id="n9"/>
<node id="n10"/>
<node id="n11"/>
<node id="n12"/>
<edge id="e0" source="n0" target="n1"/>
<edge id="e1" source="n0" target="n3"/>
<edge id="e2" source="n4" target="n5"/>
<edge id="e3" source="n6" target="n1"/>
<edge id="e4" source="n4" target="n1"/>
<edge id="e5" source="n4" target="n3"/>
<edge id="e6" source="n7" target="n1"/>
<edge id="e7" source="n2" target="n7"/>
<edge id="e8" source="n2" target="n8"/>
<edge id="e9" source="n9" target="n6"/>
<edge id="e10" source="n8" target="n10"/>
<edge id="e11" source="n5" target="n11"/>
<edge id="e12" source="n11" target="n2"/>
<edge id="e13" source="n12" target="n11"/>
<edge id="e14" source="n12" target="n7"/>
</graph>
</graphml>
20 changes: 20 additions & 0 deletions test/persistence.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,23 @@
@test length(sprint(write, p2)) == 51

rm(f)

_HAVE_LIGHTXML = try
using LightXML
true
catch
false
end

if _HAVE_LIGHTXML
#Try reading in a GraphML file from the Rome Graph collection
#http://www.graphdrawing.org/data/
let Gs = read_graphml("data/grafo1853.13.graphml")
@test length(Gs) == 1
@test Gs[1][1] == "G" #Name of graph
G = Gs[1][2]
@test nv(G) == 13
@test ne(G) == 15
end
end # _HAVE_LIGHTXML

0 comments on commit 14b1ef5

Please sign in to comment.