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

228

我有这个DTD:http://fast-code.sourceforge.net/template.dtd 但是当我把它包含在一个XML中时,我得到了警告:文档没有发现语法约束(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-multiple-variation?, class-pattern?, getter-setter?, allowed-file-extensions?, number-required-classes?, template-body)”。


8
我不会在Eclipse中执行“Preferences | XML | XML Files | Validation”这个操作,因为它只是隐藏了错误,而没有真正解决错误。如果你只使用Eclipse来构建安卓应用,那么这个“解决方案”是可以接受的。但如果你使用Eclipse来构建其他Java项目(比如JSF等),则关闭XML验证将导致这些项目出错。因此要小心。真正的解决方案是Oracle、Google和IBM更新他们的软件,包含更新的DTD和schema。 - ChuongPham
如果我在开发Android应用程序时保留一个Eclipse安装程序,同时保留另一个用于进行Java Web开发工作,那么我会发现Eclipse运行速度更快,崩溃的概率也更小。因此,我很乐意使用上述解决方案来处理我的Android ADT Eclipse安装程序。 - Damon Smith
18个回答

453

我通过在 <?xml ... > 标签后指定 <!DOCTYPE xml> 而不是指定其他内容(如您的情况中的 templates)来摆脱这个烦人的警告。

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

32
第二行中的“<!DOCTYPE xml>”中,“xml”应该与文档的根元素的名称匹配。 - Pup
2
Downvote:问题是如何使Eclipse对提问者拥有的dtd执行验证,而不是如何消除警告。 - Periata Breatta
1
不起作用。Eclipse 4.10,日期2019-05-31。有时警告会消失 - 但当您重新启动Eclipse时它会再次出现。 - mike rodent
1
两件事情:1.你的文档类型声明必须与xml文档的根节点名称匹配。2.警告可能会持续存在,直到你通过右键单击/在项目资源管理器菜单中验证来进行显式验证。 - mvreijn

168

这在Eclipse 3.7.1中对我有效:

进入首选项窗口,然后转到XML -> XML文件 -> 验证。

然后在右侧首选项面板的验证文件部分,选择“没有指定语法”参数下拉框中的“忽略”。您可能需要关闭文件,然后重新打开它才能使警告消失。


1
我必须确保“手动”框和“构建”框都被选中,然后通过右键单击项目并选择“验证”进行手动验证,以消除警告。似乎eclipse存在一个错误,验证器会出现混乱。即使您不希望在构建时进行验证,您也应该至少能够进行手动验证。然后,在进行手动验证后,您应该能够轻松清除警告。在那之前,这是解决方案。 - crowmagnumb
1
警告破坏了智能感知,我花了很多时间弄清楚原因。这解决了问题 :) - Shashank Shekhar
您还可以按项目进行此操作,这将更改您的.project文件,您可以将其检入源代码控制并帮助同事!而不是转到首选项窗口,请右键单击您的项目,然后转到属性并从那里按照上面的说明进行操作。 - Stuart Leyland-Cole
4
负评。问题的提问并不是如何隐藏警告,而是如何解决它(即让Eclipse正确验证文档)。 - Periata Breatta

37

回答:

以下是您的DTD每个部分的注释。有关更多信息,请参阅官方规范

  <!
  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文档的结构,包括:

  • 合法元素列表
  • 特殊字符
  • 字符字符串
  • 等等

例如:

<!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 解析器解析文档时,将 &nbsp; 的实例扩展为 &#xA0;
第7行) 在 XML 解析器解析文档时,将 &author; 的实例扩展为 Your Author Name
第8行) 定义结束


22

真正的解决方案:

在每个有问题的XML文件的开头添加<!DOCTYPE something>

在XML标记<?xml version="1.0" encoding="utf-8"?>之后。

你可以为doctype编写任何内容,但基本上应该是manifest、activity等,据我所知。


不起作用。Eclipse 4.10,日期2019-05-31。有时警告会消失 - 但当您重新启动Eclipse时它又会出现。 - mike rodent
@mikerodent 在项目资源管理器菜单中右键单击 / 验证后,警告可能仍然存在,直到您执行显式验证。 - mvreijn

12

你尝试过在xml目录中添加模式吗?

在eclipse中,为了避免出现“未检测到文档的语法约束(DTD或XML模式)”这种情况,我会将xsd模式文件添加到xml目录下的

"Window\preferences\xml\xml catalog\User specified entries"。

点击右侧的“添加”按钮。


示例:

<?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 文件(请参见 http://www.w3.org/Submission/wadl/ ),那里的示例使用 xsi:schemaLocation="http://wadl.dev.java.net/2009/02 wadl.xsd"。只有使用 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"、xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://wadl.dev.java.net/2009/02" 才能使其正常工作。为此,我添加了一个命名空间名称为 http://wadl.dev.java.net/2009/02 的目录条目。 - djb

11

添加 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文件中时,警告消失了。 - Eugene Gr. Philippov

8

尝试理解警告信息中给出的建议,有时可以帮助解决问题。

我也遇到了同样的问题,经过一些研究后,我找到了解决方法并通过添加以下行来解决。

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

以下是需要翻译的内容:

这在我的情况下导致了其他问题。通过阅读建议,我解决了这个问题,但又遇到了另一个问题。理解了最初的原因,即第一个链接失效(未找到),该问题得以解决。以下是逐步说明已完全解决该问题的图片。

输入图像描述

输入图像描述

输入图像描述

输入图像描述

输入图像描述


7
一种新的清晰的方法可能是按以下方式编写您的xml:

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

<rootElement>
 ....
</rootElement>

上述方法适用于Eclipse Juno及以上版本。

警告可能会持续存在,直到您通过右键单击/在项目资源管理器菜单中验证执行显式验证。 - mvreijn

5
对我来说,在Windows上运行Eclipse时,遇到了字符编码和Unix文件模式的问题:
只需将整个代码标记、剪切并粘贴回去(简而言之:CtrlA-CtrlX-CtrlV),一切都很好——不再有“没有语法约束”的警告。

4
我无法确切地说明为什么会出现“没有语法约束”的警告,但是我可以通过完全删除DOCTYPE声明在Eclipse中引发它。当我重新放置声明并再次验证时,我会收到此错误消息:

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

我认为这是正确的(不允许“number-required-classes”元素)。

括号表明顺序的重要性。您的文档在一个类模式元素后具有allow-multiple-variation元素,这是无效的。在提出不同的问题之前,您真的应该更改问题或接受现有答案。 - nitind

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