0

我正在编写一个测试和旧代码的junit测试。此代码适用于我们的 iplanet 网络服务器和我们的本地 Tomcat 服务器,并且可以正常运行。但是,当由 JUNIT 测试运行时,我得到了这个异常。

背景:它从 JAR 中提取 XSL 文件,然后使用从资源文件中读取的 xml 文档对其进行转换。

我尝试过更改变压器工厂,更改编码,并使用十六进制编辑器检查所有文件的空字符。有任何想法吗?

[致命错误]:2251:46:在属性“test”的值中发现无效的 XML 字符(Unicode:0x0),元素为“xsl:when”。系统 ID 未知;第 2251 行;第 46 列;org.xml.sax.SAXParseException;行号:2251;列号:46;在属性“test”的值中发现无效的 XML 字符(Unicode:0x0),元素为“xsl:when”。

* *更新我发现,如果我使用保存 XSL 的项目的类文件夹并将其移动到 jar 的依赖关系中它可以工作,但是如果它使用 jar 中的 xsl 它会中断

4

3 回答 3

0

建议:

1)确保您的库版本都匹配。

2)我怀疑“找到了一个无效的 XML 字符(Unicode:0x0)”可能是由几个完全不同的事情中的任何一个引起的。你应该调查他们中的每一个。

3)首先,最明显的 - 检查您的输入是否有空字符:)

4) 其次,检查你的编码——也许你的发件人写的是 UTF-16,但你的读者期待的是 UTF-8。这是一个很好的链接:

* 关于 Java 上无效 XML 字符的错误

这是一个编码问题。要么您将输入流读取为 UTF8,但它不是,或者相反。

您应该在阅读内容时明确指定编码。例如通过

new InputStreamReader(getInputStream(), "UTF-8")

另一个问题可能是tomcat。尝试URIEncoding="UTF-8"在 server.xml 文件中添加你的 tomcat 的连接器设置

5) 根本原因也可能是读取失败或某种对象丢失。也许是一个缺失的定义。

问:什么是“SystemId”?什么可能导致它“失踪”?

6)一种可能性是“resolveEntity()”失败:

InputSource resolveEntity(String publicId, String systemId)

以下是有关该问题的几个链接:

7) 这两个链接都表明“resolveEntity() 可能失败,因为您无法连接到指定的主机。检查 XML 中列出的网络主机名,并确保您可以“ping”它们。

于 2013-01-02T18:51:37.563 回答
0

如果它到达第 2251 行,则强烈表明该位置周围的文件内容有问题。如果该位置的文件没有问题,我的下一个建议是解析器有问题。我知道这听起来很疯狂,但是 JDK 中内置的 XML 解析器存在严重错误,如果您在其位置安装 Apache 版本的 Xerces,我会检查问题是否消失。在许多情况下,这只是将相关 JAR 文件放在 JDK 安装的 lib/endorsed 目录中的问题。

于 2013-01-02T23:03:45.290 回答
0

这是因为我尝试转换的 XSL 文件仍在 JAR 中。我必须先让 Maven 将文件提取到目标目录中。

于 2013-06-26T20:30:15.520 回答