为什么我们需要DTD和其他地方的“实体”

时间:2013-04-24 19:34:46

标签: html xml entity dtd

我不明白为什么我们在DTD中需要!Entities,以及像HTML这样的标记。

例如,我看到一个实体定义为<!ENTITY copy "©">

如果我们可以清楚地使用©符号,为什么我们需要在标记中使用它时使用该实体?为什么不直接输入它就像我们在这里做的那样?

是不是每个键盘上都没有某些符号?如果是这样,那么为什么当每个键盘都有一个&符号时,我们为&符号设置了一个实体。

还有一个问题 - &符号如何在&符实体的定义中使用!

如果有人能为我解决所有这些困惑,我真的很感激。

2 个答案:

答案 0 :(得分:2)

假设您想要避免遍布各处的丑陋CDATA部分,则需要<的实体,因为它在XML中具有特殊含义。鉴于您首先需要实体并且它们以&开头,您还需要一个实体。然后,您需要有一种方法将'"放在属性值中,因此您至少需要一个实体。

除此之外,如果您需要以只能传输Unicode子集的编码传输数据,您可能需要实体(当然不一定命名,数字会很好)。 Unicode编码,例如UTF-8,在您可以使用它们时非常棒,但在“真实世界”中可能并不总是这样。

然后,实体也不一定代表单个字符。例如,您可以通过在DTD中定义XML文件并在文件本身中添加&legalBlurp;&logo;来让您的XML文件包含一遍又一遍的文本块。将这种信息放在一个地方进行更改是一件好事。

答案 1 :(得分:2)

浏览器实际上并不读取DTD。从理论上讲,他们可以,并且在处理XML文档时实际上可以这样做,但HTML规范中的实体定义实际上只是一种描述浏览器应该知道的符号的方式,如内置的。当然,XML处理器可能会读取DTD,但我想这是另一回事。

所以这归结为我们为什么要使用像&copy;这样的实体引用的问题。以下列出了可能的原因:

  1. 使用非Unicode字符编码时,您需要使用实体引用或字符引用(如&#xa9;)来表示可直接表示范围之外的所有字符。
  2. 您可能希望使用实体引用,因为您没有直接输入字符的便捷方法。很多时候,人们这样做只是因为他们不会费心去学习输入特殊字符的方法。
  3. 有些字符看不见或看起来像空格。字符串“1 234”(具有不间断空格)主要以与“1 234”(具有正常空格)相同的方式显示,因此写1&nbsp;234将使得更清楚的是没有 - 打破空间。
  4. 某些角色很难在视觉上区别于其他可能更常见的角色。你看到“ - ”和“ - ”之间的区别吗?使用&minus;&ndash;可以在HTML源代码中更加突出显示。
  5. 至少在某些条件下,当要显示为数据字符时,必须使用实体引用或字符引用来编写几个字符。这适用于<&以及(带有属性值)"'
  6. 关于&copy;,几乎总是只有原因2适用。

    &符号有一个实体,因为它打开了一个实体或字符引用,因此当用作数据字符时,它本身可能需要“实现”。在HTML规范中,它被正式定义为

    <!ENTITY amp     CDATA "&#38;">
    

    因此没有歧义或永恒循环:实体与HTML中定义的所有实体一样,都是根据使用数字的字符引用来定义的。