0

我正在用 Java 编写一个使用 prefuse 库的程序。该程序根据从 twitter 收集的信息生成图表。我正在尝试让我的程序保存生成的图表,以便稍后我可以加载它们。

prefuse 类 GraphMLWriter 工作正常,它生成一个以 UTF-8 和 xml 版本编码的 graphml:1.0。

当我想加载生成的 graphml 文件时出现我的问题。为此,我使用类 GraphMLReader 的方法 readGraph(InputStream is)。此方法返回一个 Graph 对象并使用 SaxParser 解析带有 GraphMLHandler 类的处理程序对象的 graphml 文件。该对象将图形构造为解析器解析 xml 文件的所有行。当 xml 文件包含“á”或“ñ”等字符或表情符号时,我收到 prefuse.data.io.DataIOException 引发的 SAXParseException。生成的所有 xml 文件都包含表示推文的字符串。

一个例子是:

<data key="info">Las extra&#241;o muchooooo a ambas! &#55357;&#56469;</data>

错误说:

线程“主”prefuse.data.io.DataIOException 中的异常:>org.xml.sax.SAXParseException;行号:165;列号:67;字符引用 "

仅此而已,似乎错误消息已被剪切。

这些是我用来将图形对象“g”保存到 GraphML 中的代码,称为“已保存的图形”:

(new GraphMLWriter()).writeGraph(graph, "Graph saved"); 

这是我用来将图形加载到从名为“Graph saved”的GraphML文件生成的图形“g2”中的一个

Graph g2 = (new GraphMLReader().readGraph("Graph saved")); 

我能做些什么来解决这个问题?

4

1 回答 1

0

&#55357并且&#56469是代理部分,所以我猜你的原始数据包含一些扩展的 unicode 字符。似乎 prefuse创建了一个 XMLWriter,它对不一定正确的GraphMLWriter编码做出了一些假设——它假设 String 中的所有字符都是 16 位代码点并相应地对它们进行编码。在这种情况下,我们似乎有一个代理对,需要一些更智能的处理(对原作者公平,在 2005/2006 年看到这样的值有点不寻常,几乎每个人都认为 Unicode 意味着每 16 位特点)。

无论如何,我认为您在这里唯一的选择是预先过滤您的数据,或修补 prefuse 库。如果您反对分叉,一种方法是使用几乎完全相同的副本进行扩展GraphMLWriter和覆盖,将第73 行的创建替换为您自己的扩展,您可以在其中覆盖以正确处理代理。Java 的 Character 类提供的方法可以告诉您char 是否是 surrogate,以及一对字符是否构成有效的代理对- 如果找到这样的一对,则可以生成正确的 XML 实体。writeGraphXMLWriterXMLWriterescapeString

于 2017-02-11T21:54:43.040 回答