XML DTD中的PCDATA与CDATA
在
XML DTD中 – 在定义元素时,我们使用#PCDATA来表示该元素可以包含任何可解析的文本.在定义属性时,我们使用CDATA来表示其值可以是任何字符数据.
XML中使用的CDATA是XML解析器未解析的(多字符转义序列).一致地,当我们使用CDATA定义属性时;解析器不应该解析它.但是,确实如此! 那么,为什么不能使用PCDATA代替CDATA来定义属性? 更新 – 这一直保持与SGML向后兼容. SGML中这种命名背后的原因是什么?
当在属性的声明值中使用时,CDATA指的是属性(字符数据)的实际值,而不是解析它的上下文.另一方面,在解析元素时,我们需要区分字符数据与无标记(CDATA)和解析字符数据 – 其中 – 分隔符 – 预期(PCDATA).
乍一看,这似乎是武断的,但事实并非如此(见here和here). 在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表示有效属性在扩展实体后必须包含任意字符数据. 在上面的示例中,CDATA属性的值为“& foo;”相当于“bar”,与NUMBER属性的值相同“0”相当于“0”(即使序列“0”包含除数字以外的字符). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |