Eclipse对web.xml的虚假警告:"未检测到文档的语法约束(DTD或XML模式)"。

34

我的web.xml文件顶部看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
    version="2.5">

然而,Eclipse(Ganymede)仍然会警告未检测到任何XML模式,并且不会对模式违规进行警告。 我项目中的其他XML文件(例如Spring Framework配置文件)没有这个警告并确实能够正确警告有关模式违规的问题。

我该如何使模式检查工作,并希望警告消失? 服务器确实正确运行。 它似乎只是IDE的问题。


你也可以在 stackoverflow 上查看我的类似问题的答案。基本上,只需编写符合所需规则的 xml 即可。 - Damilola
6个回答

47
我也讨厌那个警告。特别是当它出现在你没有编写但出现在你的项目中的XML文件中时(如果你使用MAVEN,那就是一场噩梦)。
在Eclipse 3.5+中,您可以轻松地删除此验证规则。进入“首选项”-->“XML”-->“XML文件”-->选择“忽略”。
您可能还需要进行“项目清理”,以消除验证警告。
请参考下面的截图: alt text

我广泛使用Maven,除非它们位于目标目录中,否则不会在Maven文件上出现此错误。在这种情况下,最好添加一个规则来禁用目标目录中的验证,而不是忽略该错误。 - Dave
6
这并不能解决问题,只是掩盖了症状。 - Thorbjørn Ravn Andersen
3
我不建议在Eclipse中执行此操作:Preferences | XML | XML Files | Validation,因为这只是掩盖了错误,而不能 解决 错误。如果你只使用Eclipse来构建Android应用程序,那么这种“解决方案”可能是可接受的。但是,如果你使用Eclipse来构建其他Java项目(如JSF等),如果XML验证被“关闭”,它将会破坏这些项目。所以要小心。真正的解决方案是Oracle、Google和IBM更新他们的软件,包含最新的DTD和schema。 - ChuongPham
1
我们经常需要处理格式错误的第三方文件,特别是XML文件。虽然如果他们能够修复这些问题就好了,但事实上他们并没有这么做。因此,我只需要关闭一些无用的警告信息,这样我就可以看到那些重要的、真正的警告信息。这个解决方案确实帮助了我,谢谢。 - Chris Mills

27

也许可以尝试:

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd

改为:

http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd

此外,缺少 <!DOCTYPE ...>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<web-app
  xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
  <!-- ... -->
</web-app>

1
您还需要将xmlns从以下内容更改为:- http://java.sun.com/xml/ns/j2ee 更改为:- http://java.sun.com/xml/ns/javaee - Peter Jamieson
1
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" - Thorbjørn Ravn Andersen
在进行更改后,不要忘记对有问题的文件进行“验证”。 - Richard Sitze

10

清除存储的验证文件缓存。

依次选择 Window > Preferences > General > Network Connections > Cache,然后删除所有内容。现在重新验证文件并查看是否解决了问题。

这种情况也曾发生在我身上,只有清除验证缓存才能使其重新正常运行。清除脏缓存的建议可以在这里找到。


这对我有用。 看起来我的Eclipse在某个时候缓存了一个错误的 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 版本,导致所有的web.xml文件无法通过验证。 - Brill Pappin
这对我也起作用了,当我的Spring bean文件开始抛出这个错误时。 - Dave

2

如果您因为XML编辑器找不到XSD文件而收到相同(误导性)的错误消息,则可以添加目录条目。

您可以选择模式指定的URL,例如声明:

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                      http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"

模式文件的URL(http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd)已为命名空间http://java.sun.com/xml/ns/j2ee指定。您现在可以使用Eclipse中的工作区目录重定向文件位置:

Preferences -> XML -> XML Catalog -> Add..

使用

Key Type = Schema Location
Key = http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd

然后,您可以使用文件选择器在文件系统或工作区上选择实际的XSD文件。


0
问题有两个方面:
  1. Eclipse附带了许多知名XSD的缓存。您提供的命名空间和/或位置与其中任何一个都不匹配。
  2. 因此,Eclipse尝试在提供的URI上查找XSD(可能有效)。不幸的是,似乎在Oracle修改java.sun.com之后,这种机制在Eclipse中超时了(显然服务器重定向到主页而不是简单地说“不存在,抱歉”)。
当您将Java EE 5的正确值进行修正时,缓存中的条目将被找到,Eclipse将会很高兴。

-5
将此<!DOCTYPE ...>添加到您的xml文件中。请将其放在<?xml ...>下面:
<!DOCTYPE ??? PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

??? = 您的根元素,如果您的子元素名称使用了HTML保留字,那么您可能会遇到一些错误,您只需要将它们更改为非保留字即可。

例如:
如果您当前的子元素是<img>,请将其更改为<pic>...


1
该文件是一个web.xml文件,而不是xhtml文件。 - Brian Deacon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接