我正在尝试以编程方式读取由在线流程图/图表创建服务draw.io生成的XML文件。 Draw.io的核心是使用mxGraph构建的,尽管其类名保持不变,但最近已在外部将其命名为jgraphx(因此是本文中的标记)。

This StackOverflow post显示了如何从文件中读取原始XML数据并将其转换为mxGraph对象,而this page of the mxGraph Javadocs描述了如何从mxGraph对象转换为可渲染图像。

但是,对我来说不幸的是,尽管遵循了这两个指南,但是“渲染”的图像始终为空,并抛出了IllegalArgumentException(因为该图像为空)。我的代码如下:

String xmlFile = "work/test.xml";
String imageFile = "work/test.png";
mxGraph graph = new mxGraph();

try {
    Document doc = mxXmlUtils.parseXml(mxUtils.readFile(xmlFile));
    mxCodec codec = new mxCodec(doc);
    codec.decode(doc.getDocumentElement(), graph.getModel());
} catch (IOException e) {
    e.printStackTrace();
}

RenderedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, \\
    Color.WHITE, false, null);

try {
    ImageIO.write(image, "png", new File(imageFile));
} catch (IOException e) {
    e.printStackTrace();
}

如您所见,此代码应读取XML数据,从该数据创建一个mxGraph对象,然后将mxGraph对象呈现为当前工作目录中的图像。但是,什么也没有发生,也没有创建图像。

有没有人经历过这样的事情?我在俯视什么吗?有没有更好的方法来做我想做的事情?任何帮助,将不胜感激。

仅供引用,here is a Pastebin带有示例XML文件,以防您自己尝试。

最佳答案

在draw.io支持人员的一些帮助下,我找到了答案:XML被混淆了,是的,但并非不可避免。它只是被压缩,需要解压缩。为此:

  • Base64解码
  • 膨胀
  • URL解码

  • 我发现此链接可以一口气完成上述所有3个步骤:https://jgraph.github.io/drawio-tools/tools/convert.html

    一旦有了解压缩的XML,我的代码就可以完美运行并生成预期的输出。

    在此处查看示例实现:
    https://github.com/laingsimon/render-diagram/blob/master/drawio-renderer/src/main/java/com/simonlaing/drawiorenderer/models/DiagramDecoder.java

    09-25 19:53