使用Java从XML文件创建图形图像(png,jpg ..)

Ali*_*oud 7 java xml image graph

我有一个XML文件,我想创建一个包含一些实体的图形,然后将该图形存储在图像,JPG或PNG中.

那么Java中的库是否就像这样?或者通过解析XML文件和...来解决一些问题?

这是一个示例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>
Run Code Online (Sandbox Code Playgroud)

输出将是这样的:

在此输入图像描述

McD*_*ell 7

您可以使用众多Java XML库中的一个来提取名称.以下是使用Java DOM中的 XPath的示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

注意:它可能是拼写错误,但您的XML格式不正确 - 必须引用属性值.否则,XML解析将失败.

一些盒子

您可以使用AWT API绘制您想要的任何内容:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这段代码只是用它们周围的方框绘制名称.我确定我的抵消都到处都是,但你可能已经明白了.

有一个imageio API,可以保存几种流行的数据格式:

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);
}
Run Code Online (Sandbox Code Playgroud)


Fab*_*eeg 6

我将解析XML并输出如下的Graphviz DOT表示:

digraph {
  Tove -> Jani
  Jani -> Bill
  Bill -> John
}
Run Code Online (Sandbox Code Playgroud)

然后我使用ProcessRunner从Java调用Graphviz点可执行文件:

dot -Tpng -o file.png file.dot
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://graphviz.org.