【问题标题】:Create a graph image (png, jpg ..) from an XML file with Java使用 Java 从 XML 文件创建图形图像(png、jpg ..)
【发布时间】:2011-02-05 07:19:28
【问题描述】:

我有一个 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>

输出会是这样的:

【问题讨论】:

  • 看来graphviz.org 已经提供了你愿意实施的东西。

标签: java xml image graph


【解决方案1】:

您可以使用无数 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;
}

注意:这可能是错字,但您的 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;
  }
}

这段代码只是用一些框来绘制名称。我确定我的偏移量无处不在,但你可能明白了。

有一个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);
}

【讨论】:

【解决方案2】:

我会解析 XML 并像这样输出一个 Graphviz DOT 表示:

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

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

dot -Tpng -o file.png file.dot

更多信息请参见http://graphviz.org

【讨论】:

    【解决方案3】:

    我找到了一个 java class,它与 GraphViz 配合得很好,可以在解析 XML 文件并输出 GraphViz 表示后创建图像。 Follow this link 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2012-06-04
      • 2010-10-15
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2014-02-12
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多