【问题标题】:PCDATA vs CDATA in XML DTDXML DTD 中的 PCDATA 与 CDATA
【发布时间】:2013-12-26 18:26:24
【问题描述】:

在 XML DTD's - 当定义一个元素时,我们使用#PCDATA 来表示这个元素可以包含任何可解析的文本。在定义一个属性的时候,我们用CDATA来表示它的值可以是任何字符数据。

XML 中使用的 CDATA 是 XML 解析器无法解析的(多字符转义序列)。一致地,当我们使用 CDATA 来定义属性时;解析器不应该解析它。但是,确实如此!

那么,为什么不能用 PCDATA 代替 CDATA 来定义属性呢?

更新 - 保持这种方式是为了向后兼容 SGML。在 SGML 中这样命名的原因是什么?

【问题讨论】:

标签: xml dtd cdata sgml pcdata


【解决方案1】:

CDATA section,就像您在元素中使用的一样,与 CDATA attribute type 不同。

您最有可能观察到的解析(例如正在解析的实体引用)来自attribute-value normalization

【讨论】:

  • 这对我来说似乎有点模棱两可。此 CDATA 属性类型的工作方式类似于 DTD 中元素定义的 PCDATA 类型。为什么使用相同的名称 CDATA,PCDATA 不是更好吗?
  • @nikel - 我不知道为什么CDATA 用于属性而不是#PCDATA。如果有差异,我不确定它们是什么。
  • 我认为PCDATA 可以修改文档的实际结构,而CDATA 是任意文本。使用这个定义,我认为CDATA 的属性是有道理的。属性和部分在 CDATA 中转义内容有不同的规则,但它们最终都表示不会改变结构的字符串(除了首先存在的)。
  • “改变文档的实际结构”到底是什么意思?
  • @nikel - 请添加另一个答案而不是编辑我的答案。您的编辑是一个完全不同的答案。
【解决方案2】:

当用于属性的声明值时,CDATA 指的是属性的实际值(字符数据),而不是解析它的上下文。另一方面,在解析元素时,我们需要区分无标记字符数据 (CDATA) 和预期分隔符的已解析字符数据 (PCDATA)。

乍一看,这似乎是任意的,但事实并非如此(参见herehere)。

在 SGML 中,属性值规范可以被引用(属性值文字)或不被引用(属性值)。

attribute value specification = attribute value literal | attribute value

当属性不加引号时,只允许使用 NAME 字符,并且对于某些声明的值(例如 NUMBER)可能会受到进一步限制。

另一方面,属性值文字的内容是由 LIT/LITA 分隔符(分别为双引号和单引号)包围的可替换字符数据序列, 在参考具体语法中)。

attribute value literal =
   ( LIT , replaceable character data *, LIT) | 
   ( LITA , replaceable character data *, LITA)

可替换字符数据“与 CDATA 类似,但实体引用和字符引用被识别”(Goldfarb,SGML 手册)。

由此可见,属性值文字中实体引用的替换不依赖于属性的声明值。因此,如果您有<!ENTITY foo "bar"><elem attr="&foo;">,实体引用&foo; 将在可替换字符数据(LIT 识别模式)的上下文中解析,产生<elem attr=bar>attr 是否声明为 CDATA、NAME 或其他任何内容都没有关系。

更新

属性中的实体不用说一定要解析,因为所有属性类型都有相同的解析规则:如果属性值以引号(LIT)开头,则实体被识别(可替换字符数据)当找到匹配的结束引号时,该值结束。

这里的CDATA表示一个有效的属性必须包含展开实体后的任意字符数据。 如果该属性被声明为 NUMBER,则它必须包含数字字符(或扩展为数字字符的实体)。

在上面的示例中,值为"&foo;" 的CDATA 属性等价于"bar",就像值为"0" 的NUMBER 属性等价于"0"(即使序列"0"包含数字以外的字符)。

【讨论】:

  • 我的观点是,既然 CDATA 在解析的上下文中已经有了意义,为什么不用一个新的名字来定义属性呢? CDATA 的第二次使用(在属性定义的情况下)似乎与它在第一种情况下的使用模棱两可(元素定义:未解析 CDATA 元素)......
  • 我明白你的意思。应该向 SGML 作者询问为什么标准在两个地方使用相同关键字的问题。我们,凡人,只能详细说明这种选择如何与 CDATA 的其他用途保持一致。
  • 这就是我问的原因,也许有一些我不知道的东西可以解释这种一致性。
  • 恕我直言,我在上面的回答中解释了这种命名的一致性。
  • 我知道 CDATA 在属性方面意味着不同的东西。问题是关于在两个地方使用相同的词。也许,如果不是 CDATA 节……它们被称为 NPCDATA 节……(未解析的字符数据节)……
猜你喜欢
  • 2010-10-29
  • 2011-10-12
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2010-10-25
相关资源
最近更新 更多