【问题标题】:XML DTD failling to validateXML DTD 无法验证
【发布时间】:2012-02-15 10:44:54
【问题描述】:

我有一个带有外部 DTD 的 XML 文件...这里是 DTD:

<!ELEMENT slideshow (slide+)>
<!ELEMENT slide (image,date,time,narrative*,character*)>
<!ELEMENT image (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT time (#PCDATA)>
<!ELEMENT narrative (#PCDATA)>
<!ELEMENT character (name,dialogue*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dialogue (#PCDATA)>
<!ATTLIST dialogue name CDATA #IMPLIED>

这是我的 XML 文件的头部:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE slideshow SYSTEM "slideshow.dtd">

XML 可以很好地针对 DTD 进行验证,但是当我在 Dreamweaver 中验证 DTD 时,它无法验证并出现以下错误:

line 1: Expected comment or CDATA[xml] 
line 3: An exception occurred! Type:EmptyStackException, Message:The element stack is empty[xml]

我不明白为什么会这样,有人知道吗?

【问题讨论】:

  • 没有其余的 XML,将很难为您提供帮助
  • @Rado XML 的其余部分超过 1300 行。这并不是我构建 XML 的方式出错,而是我在 DTD 中声明元素的方式。

标签: xml validation exception dreamweaver dtd


【解决方案1】:

我认为 dtd 的定义方式没有任何问题。这已通过 Kate 的 XML Validator 成功验证:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE slideshow SYSTEM "slideshow.dtd">
<slideshow>
  <slide>
    <image>dsds</image>
    <date>dsads</date>
    <time>dsads</time>
    <narrative>fdfd</narrative>
    <narrative>fdfd</narrative>
    <character>
      <name>dasdsa</name>
      <dialogue name="dsds">dsads</dialogue>
    </character>
  </slide>
</slideshow>

[edit] 我得到了一台带有 Dreamweaver 的机器,我相信我发现了问题所在。当没有定义 dtd 时,dreamweaver 会尝试回退到已知模式并验证文档。默认回退可以在edit->preferences->validator中设置,默认情况下它设置为检查HTML 4.0。由于 dtd 不是有效的 XML 或 HTML 文件,因此验证器会正确显示错误。我认为dreamweaver 不能正确验证dtd,所以我建议您要么忽略错误,要么使用XML 模式而不是dtd,因为它是一个正确的XML 文档。您的 dtd 有效。

【讨论】:

  • 尝试验证物理 slideshow.dtd 文件。当我尝试验证文档类型声明的实际内容时,我的 XML 页面验证得很好(就像你上面的一样,结构相同)。 (我使用的是dreamweaver的验证)
  • @GeorgeReith 我没有 Dreamweaver,所以我无法真正帮助您。您可以尝试包含一个 xmlns 声明,看看是否有帮助。在您的 DTD 中的 &lt;!ELEMENT slideshow (slide+)&gt; 之后添加 &lt;!ATTLIST slideshow xmlns CDATA #FIXED ''&gt; 并查看您是否收到不同的错误。您可能必须将 xmlns 添加到每个元素,但同样,我不使用 dreamweaver,所以我不知道。祝你好运!
  • @GeorgeReith 我相信我找到了错误的原因。它不能解决您的问题,但我认为您可以忽略它或移至 xsd
【解决方案2】:

评论有点多,所以我将其添加为答案。

在对@Rado 的评论中,您说“这是在我尝试验证文档类型声明的实际内容时”...这是否意味着您正在尝试验证 only文档类型声明?像这样?:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE slideshow SYSTEM "slideshow.dtd">

如果是这样,那就行不通了。您必须有一个根元素,这可以解释“The element stack is empty”错误。

验证您的 XML 文件时会验证您的 doctype 声明。 DTD 也应该在那个时候被验证。

如果您想独立于 XML 来验证 DTD,则必须验证 DTD 文件本身。我也没有 Dreamweaver,但您的 DTD 在 oXygen 中验证良好。

【讨论】:

  • 我认为问题在于验证 dtd,而不是 XML。
  • 我确实在验证 dtd 文件本身。我猜这是 Dreamweaver 的劣质验证工具。
猜你喜欢
  • 2010-11-22
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2012-08-21
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多