Создайте графическое изображение (png, jpg ..) из XML-файла с помощью Java - PullRequest
7 голосов
/ 05 февраля 2011

У меня есть файл 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>

И вывод будет таким:

enter image description here

Ответы [ 3 ]

7 голосов
/ 05 февраля 2011

Вы можете извлечь имена, используя одну из множества библиотек Java XML. Вот пример использования XPath из 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;
}

Примечание: это может быть опечатка, но ваш XML неправильно сформирован - значения атрибутов должны быть заключены в кавычки. В противном случае синтаксический анализ XML завершится неудачей.

some boxes

Вы можете использовать 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;
  }
}

Этот код просто рисует имена с полями вокруг них. Я уверен, что мои смещения повсюду, но вы, наверное, поняли.

Существует API imageio , который может сохранять данные в нескольких популярных форматах данных:

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);
}
6 голосов
/ 05 февраля 2011

Я бы проанализировал XML и вывел бы представление Graphviz DOT следующим образом:

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

Затем я бы вызвал исполняемый файл Graphviz dot из Java с использованием ProcessRunner:

dot -Tpng -o file.png file.dot

См. http://graphviz.org для получения дополнительной информации.

0 голосов
/ 06 февраля 2011

Спасибо всем!

Я нашел класс в java, который является корпоративным с GraphViz для экстракции изображения в конце после анализа XML-файла и вывода представления GraphViz, Перейдите по этой ссылке . Хорошо с двумя методами McDowell Я могу легко анализировать файлы XML.

С наилучшими пожеланиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...