微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML DTD中的PCDATA与CDATA

XML DTD中 – 在定义元素时,我们使用#PCDATA来表示该元素可以包含任何可解析的文本.在定义属性时,我们使用CDATA来表示其值可以是任何字符数据.

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

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

更新 – 这一直保持与SGML向后兼容. SGML中这种命名背后的原因是什么?

当在属性的声明值中使用时,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,LITA)

可替换的字符数据“就像CDATA一样,除了实体引用和字符引用被识别”(Goldfarb,SGML手册).

因此,属性文字中实体引用的替换不依赖于属性的声明值.因此,如果你有<!ENTITY foo“bar”>和< elem attr =“& foo;”>实体参考& foo;将在可替换字符数据(LIT识别模式)的上下文中解析,产生< elem attr = bar>.如果attr被声明为CDATA,NAME或其他什么并不重要.

更新

没有必要说必须解析属性中的实体,因为所有属性类型都具有相同的解析规则:如果属性值以引用(LIT)开头,则识别实体(可替换字符数据)和值找到匹配的结束引用时结束.

这里CDATA表示有效属性在扩展实体后必须包含任意字符数据.
如果该属性已声明为NUMBER,则需要包含数字字符(或扩展为数字字符的实体).

在上面的示例中,CDATA属性的值为“& foo;”相当于“bar”,与NUMBER属性的值相同“&#48;”相当于“0”(即使序列“&#48;”包含除数字以外的字符).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。