未检测到文档的语法约束(DTD 或 XML 模式)

Posted

技术标签:

【中文标题】未检测到文档的语法约束(DTD 或 XML 模式)【英文标题】:No grammar constraints (DTD or XML schema) detected for the document 【发布时间】:2011-05-31 21:48:21 【问题描述】:

我有这个 dtd:http://fast-code.sourceforge.net/template.dtd 但是当我包含在 xml 中时,我会收到警告: 。 xml是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE templates PUBLIC "//UNKNOWN/" "http://fast-code.sourceforge.net/template.dtd">

<templates>
<template type="INSTANCE_OF_CLASS">
    <description>Used to Create instance of class</description>
    <variation>asasa</variation>
    <variation-field>asasa</variation-field>
    <class-pattern>asasa</class-pattern>
    <getter-setter>setter</getter-setter>
    <allowed-file-extensions>java</allowed-file-extensions>
    <number-required-classes>1</number-required-classes>
    <allow-multiple-variation>false</allow-multiple-variation>
    <template-body>
        <![CDATA[
            // Creating new instance of $class_name
            final $class_name $instance = new $class_name();
            #foreach ($field in $fields)
                $instance.$field.setter($field.value);
            #end
        ]]>
    </template-body>
</template>
</templates>

编辑:我更改了 xml,现在出现此错误:

元素类型“template”的内容必须匹配“(description,variation?,variation-field?,allow- 多变?,类模式?,getter-setter?,允许的文件扩展?,数字要求- 类?,模板主体)”。

【问题讨论】:

查看以下链接:No grammar constraints (DTD or XML schema) detected for the document 和 Bogus Eclipse warning for web.xml。 我不会这样做 首选项 | XML | XML 文件 | Eclipse 中的验证,因为这只掩盖/隐藏错误,它不会解决错误。如果你只使用 Eclipse 来构建 android 应用程序,那么这个“解决方案”是可以接受的。但是,如果您使用 Eclipse 构建其他 Java 项目 - JSF 等 - 如果 XML 验证被“关闭”,它将破坏这些项目。所以要小心。真正的解决方案是甲骨文、谷歌和 IBM 使用更新的 DTD 和模式来更新他们的软件。 如果我保留一个用于处理 android 应用程序的安装和另一个用于进行 Java Web 开发工作的安装,我发现 Eclipse 的速度要快得多,而且更不容易崩溃。所以我很乐意将上面的解决方案仅用于我的 Eclipse 的 android ADT 安装。 【参考方案1】:

在我的例子中,我通过在&lt;?xml ... &gt; 标记后添加&lt;!DOCTYPE xml&gt; 解决了这个烦人的警告。

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

【讨论】:

同意。这应该是公认的答案。 “隐藏”警告并不完全是“解决”它。 在第二行中,“”,“xml”应该与文档的根元素的名称匹配。 投反对票:问题是如何让 eclipse 对提问者拥有的 dtd 执行验证,而不是如何消除警告。 不起作用。 Eclipse 4.10,日期 2019-05-31。有时警告会消失 - 但当您重新启动 Eclipse 时它会再次出现。 两件事:1.你的doctype声明必须匹配xml文档的根节点名称。 2.警告可能会一直存在,直到您通过右键单击项目资源管理器菜单中的/验证来执行显式验证。【参考方案2】:

这在 Eclipse 3.7.1 中对我有用:转到 Preferences 窗口,然后是 XML -> XML Files -> Validation。然后在右侧首选项面板的验证文件部分中,在“未指定语法”首选项的下拉框中选择忽略。您可能需要关闭文件然后重新打开它才能使警告消失。

(我知道这个问题很老,但它是我在搜索警告时发现的第一个问题,所以我在这里为其他搜索者发布答案。)

【讨论】:

我必须确保选中“手动”框和“构建”框,然后通过右键单击项目并为警告选择“验证”进行手动验证走开。似乎 eclipse 中有一个错误,其中验证器被搞砸了。您应该至少能够进行手动验证工作,即使您不希望它在构建时发生。然后您应该能够在进行手动验证后轻松清除警告。在此之前,这就是解决方案。 警告中断了智能感知,我花了很多时间弄清楚原因是什么。这解决了它:) 您也可以在逐个项目的基础上执行此操作,这会在您的 .project 文件中进行更改,您可以检查源代码控制并帮助您的同事!无需转到“首选项”窗口,而是右键单击您的项目并转到“属性”并从那里按照上面的说明进行操作。 投反对票。提出的问题不是如何隐藏警告,而是如何解决它(即让 eclipse 正确验证文档)..【参考方案3】:

答案:

在下面对您的每条 DTD 进行评论。更多信息请参考official spec。

  <!
  DOCTYPE ----------------------------------------- correct
  templates --------------------------------------- correct  Name matches root element.
  PUBLIC ------------------------------------------ correct  Accessing external subset via URL.
  "//UNKNOWN/" ------------------------------------ invalid? Seems useless, wrong, out-of-place.
                                                             Safely replaceable by DTD URL in next line.
  "http://fast-code.sourceforge.net/template.dtd" - invalid  URL is currently broken.
  >

简单解释:

一个非常基本的 DTD 看起来像这里的第二行

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

详细说明:

DTD 用于建立商定的数据格式并验证此类数据的接收。它们定义了 XML 文档的结构,包括:

法律要素列表 特殊字符 字符串 和a lot more

例如

<!DOCTYPE nameOfYourRootElement
[
<!ELEMENT nameOfYourRootElement (nameOfChildElement1,nameOfChildElement2)>
<!ELEMENT nameOfChildElement1 (#PCDATA)>
<!ELEMENT nameOfChildElement2 (#PCDATA)>
<!ENTITY nbsp "&#xA0;"> 
<!ENTITY author "Your Author Name">
]>

以上行的含义... 第 1 行)定义为“nameOfYourRootElement”的根元素 第 2 行)元素定义的开始 第 3 行)定义为“nameOfYourRootElement1”和“nameOfYourRootElement2”的根元素子元素 第 4 行)子元素,定义为数据类型#PCDATA 第 5 行)子元素,定义为数据类型#PCDATA 第 6 行)当 XML 解析器解析文档时,将 &amp;nbsp; 的实例扩展为 &amp;#xA0; 第 7 行)当 XML 解析器解析文档时,将 &amp;author; 的实例扩展为 Your Author Name 第 8 行)定义结束

【讨论】:

【参考方案4】:

真正的解决方案:

在每个有问题的 XML 的开头添加&lt;!DOCTYPE something&gt;

在xml标签&lt;?xml version="1.0" encoding="utf-8"?&gt;之后

你可以为doctype写任何东西,但据我所知,基本上它应该是manifest、activity等

【讨论】:

不起作用。 Eclipse 4.10,日期 2019-05-31。有时警告会消失 - 但当您重新启动 Eclipse 时它会再次出现。 @mikerodent 警告可能会持续存在,直到您通过右键单击/在项目浏览器菜单中进行验证来执行显式验证【参考方案5】:

您是否尝试将架构添加到 xml 目录?

在 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 文件并进行一些更改以违反架构,应该通知您

【讨论】:

这对我有用,但是有了这个改变。我正在编辑一个 .wadl 文件(请参阅 w3.org/Submission/wadl )以及那里使用的示例。我只能通过使用 xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" xmlns="wadl.dev.java.net/2009/02" 而不是 xsi:schemaLocation="wadl.dev.java.net/2009/02 wadl.xsd “作为该提交文件中的示例。我使用wadl.dev.java.net/2009/02 为命名空间名称添加了一个目录条目【参考方案6】:

添加 DOCTYPE 标签 ...

在这种情况下:

<!DOCTYPE xml>

在后面添加:

<?xml version="1.0" encoding="UTF-8"?>

所以:

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

【讨论】:

在 Eclipse JEE v. 2018-12 上为我工作。当我将这两行添加到 ant 的 build.xml 时,警告消失了【参考方案7】:

尝试理解警告消息中给出的建议,这有时会有所帮助。

我也遇到了同样的问题,经过一番研究,我找到了解决方案,并通过在开头添加以下行来解决

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

在我的情况下会导致其他一些问题。 我通过阅读建议解决了这个问题,这又变成了另一个问题,已经解决了理解原始原因的问题,即第一个链接被破坏(未找到)。下面是一步一步的图像,它解释了为完全解决问题所做的工作。

【讨论】:

【参考方案8】:

一种新的干净方式可能是像这样编写您的 xml:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE rootElement>

<rootElement>
 ....
</rootElement>

以上在 Eclipse Juno+ 中工作

【讨论】:

警告可能会一直存在,直到您在项目浏览器菜单中通过右键单击/验证执行显式验证。【参考方案9】:

对我来说,字符编码unix文件模式在Windows上运行eclipse是个问题:

只需标记完整的代码,剪切并粘贴回来(简而言之:CtrlA-CtrlX-CtrlV),一切都很好 - 不再出现“无语法限制...”警告

【讨论】:

【参考方案10】:

我真的不能说为什么您会收到“无语法约束...”警告,但我可以通过完全删除 DOCTYPE 声明在 Eclipse 中引发它。当我放回声明并再次验证时,我收到以下错误消息:

元素类型“模板”的内容 必须匹配 "(description+,variation?,variation-field?,allow-multiple-variation?,class-pattern?,getter-setter?,allowed-file-extensions?,template-body+)。

我相信这是正确的(不允许使用“number-required-classes”元素)。

【讨论】:

括号表示顺序很重要。您的文档在 class-pattern 元素之后有一个 allow-multiple-variation 元素,这是无效的。您确实应该在询问其他问题之前更改问题或接受现有答案。【参考方案11】:

我知道这是旧的,但我通过了同样的问题,并在 spring 文档中找到了解决方案,以下 xml 配置已经为我解决了这个问题。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx 

<!-- THIS IS THE LINE THAT SOLVE MY PROBLEM -->
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 

http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

在我按照本论坛主题中的建议放置上述行之前,我有相同的警告消息,并将其放置...

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

它给了我以下警告信息...

The content of element type "template" must match "
(description,variation?,variation-field?,allow- multiple-variation?,class-
pattern?,getter-setter?,allowed-file-extensions?,number-required- 
classes?,template-body)".

所以请尝试使用我的 xml 配置中的 sugested 行。

【讨论】:

【参考方案12】:

这可能是由于在 eclipse 中关闭了验证。

【讨论】:

【参考方案13】:

在 Eclipse 3.5.2 中解决了这个问题。两个完全相同的布局,其中一个有警告。关闭所有选项卡,重新打开时警告消失了。

【讨论】:

【参考方案14】:
    将整个代码复制到记事本中。 使用任何名称临时保存文件[保存文件时使用“编码”= UTF-8(或更高版本,但 UTF)]。 关闭文件。 再次打开它。 复制粘贴回您的代码。

错误必须消失。

【讨论】:

【参考方案15】:

我在 xsi:noNamespaceSchemaLocation 中使用了相对路径来提供本地 xsd 文件(因为我无法在实例 xml 中使用命名空间)。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../project/schema.xsd">
</root>

验证有效,警告已修复(不被忽略)。

https://www.w3schools.com/xml/schema_example.asp

【讨论】:

【参考方案16】:

我在使用 web.xml 文件的 Eclipse 中也遇到了同样的问题 它向我展示了“文档中没有引用语法约束”

但是可以通过添加标签来解决 在xml标签之后,即&lt;?xml version = "1.0" encoding = "UTF-8"?&gt;

【讨论】:

对我来说工作得很好(Eclipse Luna)谢谢【参考方案17】:

这是解决此问题的有效解决方案:


第 1 步:右键单击项目并转到属性

第 2 步:转到“库”并删除项目的“JRE 系统库”

第 3 步:点击“添加库”-->“JRE 系统库”-->选择“工作区默认 JRE”

第 3 步:转到“订购和导出”并标记新添加的“JRE 系统库”

第 4 步:刷新和清理项目

尤里卡!它正在工作:)

【讨论】:

我尝试使用您的解决方案。但不幸的是,当我刷新和清理我的项目时,新添加的“JRE 系统库”从我的“库”部分以及“订单和导出”部分中消失了。请帮忙。 这个答案的大部分与问题无关,除了第 4 步“清理项目”可能(或可能没有)帮助。【参考方案18】:

我发现解决方案非常简单,我认为您应该在修改偏好之前尝试一下。就我而言,我在一个以“资源”为基本标签的字符串文件中遇到了这个问题......我所做的只是从顶部和底部删除标签,清理项目,保存文件并重新插入标签。 这个问题已经消失了,从来没有给我任何警告。 这听起来很简单,但是嘿,有时它是解决问题的最简单的事情。干杯

【讨论】:

以上是关于未检测到文档的语法约束(DTD 或 XML 模式)的主要内容,如果未能解决你的问题,请参考以下文章

xml约束

XML约束

在 Eclipse 中禁用 Ant 脚本的 DTD 警告?

xml约束技术---schema

XML约束

XML的验证模式DTD与XSD的区别