SAXParseException 与 Prefuse 的 GraphMLReader 一起使用

Posted

技术标签:

【中文标题】SAXParseException 与 Prefuse 的 GraphMLReader 一起使用【英文标题】:SAXParseException working with GraphMLReader of Prefuse 【发布时间】:2016-12-13 05:35:12 【问题描述】:

我正在用 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"); 

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

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

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

【问题讨论】:

'á' 或 'ñ' (= ñ) 这样的字符在我测试时似乎有效。 导致 SAX 出现问题(不是 prefuse)。 是的,你是对的,我没有注意到这一点。谢谢。当我生成图表时(恢复 Twitter 信息),我用 JPopUpMenu 显示推文,它可以识别表情符号。那么如何将表情符号放在graphML文件中,以便稍后在加载图形时显示它? 【参考方案1】:

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

无论如何,我认为您在这里唯一的选择是预先过滤您的数据,或修补 prefuse 库。如果您反对分叉,一种方法是扩展GraphMLWriter 并用几乎完全相同的副本覆盖writeGraph,用创建您自己的扩展XMLWriter 来替代在line 73 上创建XMLWriter escapeString 妥善处理代理人。 Java 的 Character 类提供了告诉您是否为 char is a surrogate 和是否为 pair of a characters make a valid surrogate pair 的方法 - 如果您找到这样的一对,则可以生成正确的 XML 实体。

【讨论】:

以上是关于SAXParseException 与 Prefuse 的 GraphMLReader 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

安卓中的 SAXParseException

如何解决 Jenkins 中的 SAXParseException?

SAXParseException:找不到元素“定义”的声明

SAXParseException:找不到元素“定义”的声明

org.xml.sax.SAXParseException:prolog 中不允许内容

使用 mysql 进行休眠配置会出现错误 - SAXParseException