我正在编写一个正在测试的junit测试和旧代码。此代码适用于我们的iplanet Web服务器和本地Tomcat服务器,运行时没有任何问题。但是当通过JUNIT测试运行时,我得到了这个异常。
背景:它从JAR中提取XSL文件,然后使用从资源文件读入的xml文档对其进行转换。
我尝试更改变换器工厂,更改编码,并使用十六进制编辑器检查所有文件是否为空字符。有什么想法吗?
[致命错误]:2251:46:在属性“test”的值中找到了无效的XML字符(Unicode:0x0),元素为“xsl:when”。 SystemId未知;第#2251行;第46栏; org.xml.sax.SAXParseException; lineNumber:2251; columnNumber:46;在属性“test”的值中找到了无效的XML字符(Unicode:0x0),元素为“xsl:when”。
* * UPDATE 我发现,如果我使用项目的类文件夹,其中包含XSL并将其移动到jar的依赖项,它可以工作,但如果它使用jar中的xsl则会中断
答案 0 :(得分:0)
SUGGESTIONS:
1)确保您的库版本都匹配。
2)我怀疑“找到了无效的XML字符(Unicode:0x0)”可能是由几个完全不同的东西引起的。你应该调查每一个。
3)首先,最明显的 - 检查输入是否为空字符:)
4)其次,检查您的编码 - 也许您的发件人正在编写UTF-16,但您的读者期待UTF-8。这是一个很好的链接:
* Error about invalid XML characters on Java
这是编码问题。您可以将输入流读作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”他们。
答案 1 :(得分:0)
如果它到达第2251行强烈暗示该位置周围的文件内容有问题。如果该位置的文件没有任何问题,我的下一个建议就是解析器出错了。我知道这听起来很疯狂,但内置于JDK的XML解析器严重错误,如果你安装Apache版本的Xerces,我会检查问题是否消失。在许多情况下,这只是将相关JAR文件放在JDK安装的lib / endorsed目录中的问题。
答案 2 :(得分:0)
这是因为我试图转换的XSL文件仍然在JAR中。我必须让Maven首先将文件解压缩到目标目录中。