DOCTYPE在一般XML中的作用

xyz*_*xyz 0 html xml xhtml doctype

就Web标准和页面验证而言,我知道DOCTYPE的目的(以及该行上的每个url /标识符是什么),但我不确定它在XML文档的上下文中实际上是什么"是".

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>My Page</title>
  </head>
  <body>
    <p>Hello</p>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

它是实际XML文档结构的一部分,还是某种类似注释的"提示",然后被删除?

"!"的意义是什么?在名字之前?这是否表示一种特殊类型的"元素"?他们叫什么?

我发布的示例是Web上的XHTML,但DOCTYPE是否也用于通用XML文档?

Kor*_*nel 6

DOCTYPE已经从SGML"继承"了(它应该指向解释如何解析文件的DTD文件),但是不言自明的XML语法和命名空间使它变得无关紧要.XML中DOCTYPE/DTD的唯一实际用途是定义允许的命名实体(例如&nbsp;).

XML规范甚至允许完全忽略DTD文件的"非验证"解析器(Web浏览器使用这样的解析器,除非您陷入text/html陷阱,在这种情况下根本不使用XML解析器).

DTD 很难用于验证(很难为多个嵌套级别指定规则,无法指定超出几个预定义类型的属性类型).Schema,RelaxNG可以更精确.

DTD也没有完全支持命名空间,这导致了像XHTMLplusMathMLplusSVG DOCTYPE这样荒谬的变通方法.

在Web浏览器中,某些DOCTYPE具有触发符合标准的呈现模式的期望副作用.这比使用DOCTYPE更多的是黑客攻击.

  • 如果您正在使用真正的XHTML(application/xhtml+xml- 根本不在IE中打开的那个),那么根本不要使用DOCTYPE(来自XHTML 5的建议).无论DOCTYPE如何,XML模式都将触发符合标准的渲染.

  • 如果您正在使用text/html模式,请使用<!DOCTYPE html>.这是HTML 5 DOCTYPE,它是最短的,可以在所有浏览器中触发最佳渲染.浏览器不会将DOCTYPE用于任何其他目的,因此您不会错过任何内容.

  • 如果您正在使用XML解析器(外部浏览器)处理XHTML文件,那么不要忘记正确设置DTD目录,否则您的解析器可能是DoS-ing w3.org每次尝试获取DTD.如果您不能使用DTD目录,则在解析器中禁用"externals"或省略DOCTYPE并且不使用命名实体(即使用&#160;而不是&nbsp;)