Create a graph image (png, jpg ..) from an XML file with Java Create a graph image (png, jpg ..) from an XML file with Java xml xml

Create a graph image (png, jpg ..) from an XML file with Java


You can extract the names using one of the myriad of Java XML libraries. Here's an example using XPath from a Java DOM:

private static List<String> findNames(Document doc)                                           throws XPathExpressionException {  XPath xpath = XPathFactory.newInstance().newXPath();  NodeList nodes = (NodeList) xpath.evaluate("/process/p", doc,                                                     XPathConstants.NODESET);  List<String> names = new ArrayList<String>();  for (int i = 0; i < nodes.getLength(); i++) {    names.add(nodes.item(i).getTextContent());  }  return names;}

Note: it may be a typo, but your XML is not well formed - attribute values must be quoted. XML parsing will fail otherwise.

some boxes

You can use the AWT API to draw whatever you want:

private static final int BORDER = 1;private static final int PADDING = 2;private static final int SPACER = 5;private static void draw(Graphics2D g, List<String> names) {  FontMetrics metrics = g.getFontMetrics();  Rectangle box = new Rectangle(1, 1, 0, 0);  box.height = metrics.getHeight() + (PADDING * 2);  g.setColor(Color.WHITE);  for (String name : names) {    box.width = metrics.stringWidth(name) + (PADDING * 2);    g.drawString(name, box.x + BORDER + PADDING, PADDING + BORDER +                                                    metrics.getHeight());    g.drawRect(box.x, box.y, box.width, box.height);    box.x += box.width + (BORDER * 2) + SPACER;  }}

This code just draws the names with some boxes around them. I'm sure my offsets are all over the place, but you probably get the idea.

There is an imageio API that can save in a few popular data formats:

private static void save(List<String> names, File file) throws IOException {  BufferedImage image = new BufferedImage(600, 50, BufferedImage.TYPE_INT_RGB);  Graphics2D g = image.createGraphics();  try {    draw(g, names);  } finally {    g.dispose();  }  ImageIO.write(image, "png", file);}


I'd parse the XML and output a Graphviz DOT representation like this:

digraph {  Tove -> Jani  Jani -> Bill  Bill -> John}

Then I'd call the Graphviz dot executable from Java using ProcessRunner:

dot -Tpng -o file.png file.dot

See http://graphviz.org for further info.


I found a java class that works great with GraphViz to create an image after parsing the XML file and output a GraphViz representation. Follow this link for more information.