【发布时间】:2009-08-31 13:53:03
【问题描述】:
我正在使用供应商小程序,该小程序在 JRE 1.4.2_X 和 1.6.X 上运行良好,但在 1.5.X 的每个版本上都失败了。由于另一个应用程序冲突无法与 Java 6 配合使用,因此无法使用 1.6 运行。
我认为问题在于未验证 DTD。这会导致“未声明”问题和产生的空指针。
Error: Fri Aug 28 11:21:29 EDT 2009 org.xml.sax.SAXParseException:
Element type "UserSessionList" is not declared.
java.lang.NullPointerException
我尝试更改默认验证类,但问题仍然没有改变。
-Djavax.xml.validation.SchemaFactory:http://relaxng.org/ns/structure
/1.0=org.apache.xerces.jaxp.validation.XMLSchemaFactory
我可以为此使用其他验证吗?
我真的没有选择修改小程序的代码,该小程序已超出供应商的生命周期,因此不太可能获得他们的支持。因此,任何解决方法都不能涉及更改代码,因为我们不拥有它。
【问题讨论】:
-
第 1 点:JDK 1.5 确实验证了 DTD;如果没有,我有一堆程序会失败。
-
第 2 点:它说的元素类型没有声明这一事实强烈表明它实际上是针对 DTD 进行验证的,或者 XML 有一个不属于其中的元素该 DTD 或 DTD 内部不一致(尚未查看该错误消息的原因)。
-
第 3 点:Sun JDK(我相信还有 JRockit)已经使用 Xerces。因此,除非您在 Xerces 发行版而不是 JDK 发行版中修复了特定错误,否则设置不同的验证器对您没有帮助。
-
第 4 点:模式验证的处理方式与 DTD 验证不同。你用的是哪个?
-
这不是我的代码,所以除非我开始反编译类,否则我不确定我是否能回答所有问题。我缺乏关于验证的深入知识。我无法弄清楚为什么这在 1.6 中可以正常工作,但在 1.5 中却失败了。我尝试在 1.5 中使用 1.6 认可的 jaxp jar,但我得到了同样的错误。由于这在 1.5 上是 100% 可重现的,我不认为它在 dtd 中没有的 xml 中出现了一些疯狂的事情,但由于某种原因,dtd 甚至没有被加载。有什么方法可以验证吗?如何判断我使用的是模式还是 dtd 验证?
标签: java validation applet dtd