【问题标题】:Use of Name in Doctype Declarations in XML在 XML 中的 Doctype 声明中使用名称
【发布时间】:2013-11-05 10:39:27
【问题描述】:

我尝试了使用不同于根元素名称的名称的内部和外部 DTD,它仍然有效!

关于下面标签中“名称”的值-

<DOCTYPE Name SYSTEM "Couple.dtd">

那么这个“名字”有什么用呢?

1) 内部 DTD

<!DOCTYPE  SampleDocType[
<!ELEMENT Neighbours (Couple, Couple) >
<!ELEMENT Couple (Name, Name) >
<!ELEMENT Name ( Vorname, Nachname, Geschlecht) >
<!ELEMENT Vorname (#PCDATA) >
<!ELEMENT Nachname (#PCDATA) >
<!ELEMENT Geschlecht (#PCDATA) >
]>

<Couple>

    <Name>

        <Vorname>Marie</Vorname>

        <Nachname>M&#252;ller</Nachname>

        <Geschlecht>&#61;</Geschlecht>

    </Name>

    <Name>


        <Vorname>Klaus</Vorname>

        <Nachname>M&#xfc;ller</Nachname>

        <Geschlecht>♂</Geschlecht>

    </Name>

</Couple>

2)外部DTD

<!DOCTYPE SampleDocType SYSTEM "Couple.dtd" >

<Couple>

<Name>

 <Vorname>Marie</Vorname>

 <Nachname>M&#252;ller</Nachname>

 <Geschlecht>&#61;</Geschlecht>

</Name>

<Name>


 <Vorname>Klaus</Vorname>

 <Nachname>M&#xfc;ller</Nachname>

 <Geschlecht>♂</Geschlecht>

</Name>

</Couple>

外部 DTD 文件

<!ELEMENT Neighbours ( Couple, Couple) >
<!ELEMENT Couple (Name, Name) >
<!ELEMENT Name ( Vorname, Nachname, Geschlecht) >
<!ELEMENT Vorname (#PCDATA) >
<!ELEMENT Nachname (#PCDATA) >
<!ELEMENT Geschlecht (#PCDATA) >

注意 - 我在 Notepad++ 中使用 XMLtools 插件进行验证。

【问题讨论】:

  • 这里的“它仍然有效”是什么意思?
  • 它说 DOCTYPE“名称”必须匹配根元素名称,我没有遵循。但我的文档仍然通过了验证。
  • 不强制执行有效性约束“根元素类型”(下面由 Daniel Haley 引用)的验证器不是符合标准的 XML 验证器。当然,这并不能回答您的问题(文档类型声明中的名称有什么用?)。

标签: xml dtd


【解决方案1】:

你问 ...&lt;!DOCTYPE Name SYSTEM "Couple.dtd"&gt; 中的“名称”有什么用?

与所有有意的冗余一样,XML 文档类型声明中的名称允许进行一致性检查。在 SGML(XML 继承声明的语法)中,检查可能更重要,因为文档类型声明和文档最外层元素的开始标记可能位于不同的文件或实体中。由于 XML 要求文档类型声明(如果存在)与文档最外层元素的标记位于同一数据流中,因此 XML 中的冗余需求不太明显,并且可以说保留名称是为了与 SGML 兼容。

【讨论】:

  • 这是有道理的! :) 。但是,一致性检查究竟是什么意思?现在,我认为在 SGML 中 - 如果 doctype 声明位于不同的文件中,并且 DOCTYPE 声明中的名称与根元素名称不同;它甚至无法验证...解析器如何知道要使用哪个 DTD 以及它位于何处?对吗?
【解决方案2】:

根据规范(1.01.1):

文档类型声明中的名称必须与元素类型匹配 的根元素。

如果您的工具没有将此报告为错误,我认为是工具的问题。

【讨论】:

  • 猜猜看。有任何简单的实用程序可以根据 DTD 和 XSD 检查 XML 的有效性吗?
  • Notepad++ 中的 XML 工具插件使用 libxml2。该插件的“立即验证”命令似乎有问题。使用--valid 选项在 XML 示例上运行 xmllint(libxml2 附带的命令行工具)会产生预期的错误消息:element Couple:validity error : root and DTD name do not match 'Couple' and 'SampleDocType'.
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多