2011-02-05 39 views
6

Tengo un archivo XML y quiero crear un gráfico con algunas entidades, luego almaceno este gráfico en una imagen, JPG o PNG.Crear una imagen de gráfico (png, jpg ..) desde un archivo XML con Java

Entonces, ¿hay una biblioteca en Java que haga esto? ¿O hay algunos trucos al analizar archivos XML y ...?

Aquí un ejemplo de archivo XML:

<?xml version="1.0"?> 
<process> 
    <p n="1">Tove</p> 
    <p n="2">Jani</p> 
    <p n="2">Bill</p> 
    <p n="4">John</p> 
</process> 

Y la salida será como esto:

enter image description here

+0

Parece que proporciona http://www.graphviz.org/ ya lo que usted dispuesto a poner en práctica. – Rekin

Respuesta

7

puede extraer los nombres usando uno de los miles de librerías XML Java. Aquí hay un ejemplo usando XPath de un 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; 
} 

Nota: puede ser un error tipográfico, sino el código XML no está bien formado - valores de los atributos deben ser citados. El análisis XML fallará de lo contrario.

some boxes

Puede utilizar el AWT API para dibujar lo que quieras:

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; 
    } 
} 

Este código sólo dibuja los nombres con unas cajas a su alrededor. Estoy seguro de que mis compensaciones están por todos lados, pero probablemente entiendas la idea.

Hay un imageio API que puede salvar en pocos formatos de datos populares:

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); 
} 
+0

Gracias hombre! Encontré una clase en java que es corporativa con GraphViz para extraer una imagen al final después de analizar el archivo XML y generar una representación de GraphViz http://www.loria.fr/~szathmar/off/projects/java/GraphVizAPI/index .php # history – alibenmessaoud

6

me gustaría analizar el XML y la salida de una representación Graphviz DOT así:

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

Entonces' d Llamar al ejecutable Graphviz dot desde Java usando ProcessRunner:

dot -Tpng -o file.png file.dot 

Ver http://graphviz.org para más información.

0

¡Gracias a todos!

He encontrado una claseen Java que es corporativa con GraphViz a extraxt una imagen al final después de analizar el archivo XML y la salida de una representación GraphViz, Follow this link. Bien con los dos métodos de McDowell Puedo analizar archivos XML fácilmente.

Saludos

Cuestiones relacionadas