如何修复Eclipse验证错误“文档中未检测到语法约束条件”?

60

Eclipse 3.5.2出现了一个XML模式警告消息:

No grammar constraints (DTD or XML schema) detected for the document.
应用程序的 application.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<application
  xmlns="http://java.sun.com/xml/ns/javaee"
  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/application_5.xsd"
  version="5">

</application>

我不想禁用警告。 如何让Eclipse正确验证XML文档?


哦,很抱歉,我仍然无法在我安装的Galileo版本(3.5)上重现这个警告。 :( - Matt Ball
使用Helios版本,我将您的xml粘贴到一个新文件NewFile.xml中,并看到了这个警告信息;然后我将文件重命名(任意名称),警告消失了。很奇怪,但很容易尝试... - kem
1
你是否需要代理连接互联网? - biziclop
重命名没有成功;机器上的互联网正在工作。 - cmcginty
哇,这个问题真的变成了一个流行的话题... - cmcginty
1
可能是重复的问题:文档中未检测到语法约束(DTD或XML模式) - avalancha
18个回答

65
将这个代码放在有问题的文件的顶部对我来说是有效的:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE project>

3
对我来说,这只是完全停止了验证,因此删除了错误信息。 - AlexWien
2
尝试在Eclipse Luna上运行此代码,结果出现了一个新的警告:“SchemaLocation: schemaLocation value = 'http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd' must have even number of URI's.”。请参考acdcjunior的回答MahmoudS的问题 - Gerold Broser

46

不确定您是否解决了这个问题,但今天在使用Eclipse 3.6中的一些Spring配置文件时,我偶然看到了这篇帖子。 无论如何,我都不能让Eclipse中的“问题”视图消失,直到我右键单击问题并将其删除

我想,如果重新验证后确实存在问题,它会再次出现,但到目前为止没有。问题是,我有一个几乎相同的Spring配置文件,但它没有显示错误。

看来有时候Eclipse里的东西就是会卡住。不知道为什么,但这和文件与编辑器不同步并且迫使刷新一样,我也只能接受它了。


这个问题得到了投票,所以我会将其标记为正确。 - cmcginty
1
同意,我无论使用下面的任何方法都无法解决这个问题。最终,我决定将其删除,让它离开我的视线,因为它最终并没有影响项目。谢谢@Jason。 - Nirav Zaveri
2
这对我有效。但在项目清单的代码文件中仍然有一个令人讨厌的警告标志。添加 <!DOCTYPE xml> 也解决了这个问题! - user1300214

35

这是另一种关闭警告的方式,适用于故意缺少 DTP 或 XSD 的 XML 文档:

  1. 进入菜单选项首选项(Preferences)
  2. 在导航菜单中,即对话框的左侧栏中选择:XML > XML 文件 > 验证 (Validation)
  3. 在配置区域中,即对话框的右侧栏中选择:验证文件 > 未指定语法 > 忽略 (这是一个下拉框,默认设置为警告)

这也被证实可以在Eclipse Luna上工作。我选择了这种方法。 - k_rollo

7

我不是专家,只是一个学习者。我偶然发现了一个简单而愚蠢的方法来解决这个问题。你需要做的就是:

按下 ctrl + shift + F(这是在Eclipse中格式化文件的快捷方式)

如果这不能解决问题,那么请在特定行开头
?xml version="1.0" encoding="UTF-8"?处按下TAB键,而不是在其他任何地方(我不知道为什么,但这起作用。如果有人知道原因,我会很高兴知道)

然后按下ctrl + shift + F并保存。

警告将消失,至少对我来说是这样的,你可以自己试试...


6
如果出现此警告,则表示XML验证功能(与XML实例编辑器不同!)不知道要应用哪个DTD或XSD。这当然也意味着它实际上没有检查XML实例是否符合任何架构。
因此,这是一个有用的警告,不应该关闭(如果您使用验证菜单功能并期望它执行某些操作)。
您可以使用首选项使模式知名:
- 打开首选项/XML目录/用户指定条目 - 点击添加... - 在“位置”中输入要使用的XSD文件 - 选择密钥类型“模式位置”(如果您有xsi:schemaLocation) - 将内容匹配文件作为“键”的URL(位置的第二部分)输入 - 按下OK - 转到问题视图并删除验证警告 - 右键单击XML文件,再次选择“验证”
一些公共标识符和模式位置已包含在“插件指定条目”中(特别是如果您安装了WSTP)。对于这些命名空间,您将不会收到警告(因为它使用系统提供的副本进行验证)。

1
实际上,这是提供解决方案的真正答案。这个答案应该被接受。 - TomR

5
将以下代码添加到您的XML文件开头:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE RelativeLayout>

RelativeLayout 更改为您定义的根布局,然后在左侧找到 XML 文件,在布局文件夹中单击右键并选择验证。


3
在Eclipse中,为了避免出现“文档中未检测到语法约束(DTD或XML模式)”的错误信息,我使用以下方法将XSD模式文件添加到XML目录中:

依次选择“窗口 \ 首选项 \ XML \ XML目录 \ 用户指定条目”,然后点击右侧的“添加”按钮。


示例:

<?xml version="1.0" encoding="UTF-8"?>
<HolidayRequest xmlns="http://mycompany.com/hr/schemas">
    <Holiday>
        <StartDate>2006-07-03</StartDate>
        <EndDate>2006-07-07</EndDate>
    </Holiday>
    <Employee>
        <Number>42</Number>
        <FirstName>Arjen</FirstName>
        <LastName>Poutsma</LastName>
    </Employee>
</HolidayRequest>

我从这个XML文件中生成并保存了一个XSD文件,路径为:/home/my_user/xsd/my_xsd.xsd

作为位置:/home/my_user/xsd/my_xsd.xsd

作为键类型:命名空间名称

作为键:http://mycompany.com/hr/schemas


关闭并重新打开XML文件并进行一些更改以违反模式,您将收到通知。


2

我曾经成功地使用1.4版本的application.xsd进行操作。如果有人能解释为什么JavaEE版本无法正常运行,我将不胜感激。

<?xml version="1.0" encoding="UTF-8"?>
<application
  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/application_1_4.xsd"
  version="1.4">

我仍然认为网络代理理论最有可能。你确定Eclipse能够执行远程HTTP请求吗?你可以从Web浏览器或命令行完成操作并不意味着Eclipse也可以。而且验证器可能正在使用硬连线的1.4 xsd副本。 - Stephen C
2
我可以正常运行“检查更新”。如果有其他验证Eclipse是否具有网络访问权限的方法,请发布它。 - cmcginty
我猜这是因为JST标准模式插件提供了“旧”模式位置。您可以在XML目录插件指定条目中看到它。我的JST(Eclipse Mars)也提供了“命名空间名称http://xmlns.jcp.org/xml/ns/javaee/application_5.xsd”。 - eckes

1
以下是对我有用的解决方法。 我使用没有版本号的模式(例如spring-beans.xsd,而不是spring-beans-4.1.xsd),它们可能已经被更新了。 我认为问题在于Eclipse保留了旧版本的脏缓存。
解决方法:
1. 进入Window -> Preference -> Network Connection -> Cache
2. 删除所有已缓存的模式。
3. 在问题视图中删除所有无语法约束的问题。
4. 重新验证项目。

我在XML目录中有正确的条目,但这是我必须执行的操作,以清除它们并重新加载它们。 - Jim Richards

0
昨晚我遇到了这个问题(使用eclipse V.kepler)。我完全是Java和Eclipse的新手,正在尝试自学如何制作Android应用程序。当我在developers.android.com上学习课程时,我将以下内容输入到我的main_activity_actions.xml文件中:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<!--  Search should appear as an action button -->
<item android:id="@+id/action_search"
      android:icon="@drawable/ic_action_search"
      android:title="@string/action_search"
      android:showAsAction="ifRoom"/>

</menu>

这给了我和 OP 一样的错误。我尝试了添加建议,但仍然出现错误。

<!DOCTYPE project> 

在第一行下面加上这段代码,问题就解决了。


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