【问题标题】:SAXParseException working with GraphMLReader of PrefuseSAXParseException 与 Prefuse 的 GraphMLReader 一起使用
【发布时间】: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文件中,以便稍后在加载图形时显示它?

标签: xml utf-8 saxparser invalid-characters prefuse


【解决方案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 实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2015-08-15
    相关资源
    最近更新 更多