DTD中PCDATA和CDATA之间的区别
DTD中的 #PCDATA
和#CDATA
什么区别?
PCDATA – parsing字符数据
XMLparsing器通常parsingXML文档中的所有文本。
CDATA – (未parsing)字符数据
术语CDATA用于不应被XMLparsing器parsing的文本数据。
像“<”和“&”这样的字符在XML元素中是非法的。
- PCDATA是将由parsing器parsing的文本。 文本中的标签将被视为标记,实体将被展开。
- CDATA是不会被parsing器parsing的文本。 文字内的标签不会被视为标记,实体也不会被展开。
默认情况下,一切都是PCDATA。 在下面的例子中,忽略根, <bar>
将被parsing,并且它将没有内容,而是一个孩子。
<?xml version="1.0"?> <foo> <bar><test>content!</test></bar> </foo>
当我们想要指定一个元素只包含文本而没有子元素时,我们使用关键字PCDATA,因为这个关键字指定元素必须包含可parsing的字符数据 – 也就是除了小于(< ),大于(>),符号(&),引号(')和双引号(“)。
在下一个例子中, <bar>
包含CDATA。 它的内容不会被parsing,因此是<test>content!</test>
。
<?xml version="1.0"?> <foo> <bar><![CDATA[<test>content!</test>]]></bar> </foo>
SGML中有几种内容模型。 #PCDATA内容模型表示一个元素可能包含纯文本。 它的“parsing”部分意味着标记(包括PI,注释和SGML指令)被parsing,而不是显示为原始文本。 这也意味着实体引用被replace。
另一种允许纯文本内容的内容模型是CDATA。 在XML中,元素内容模型可能不会隐式设置为CDATA,但在SGML中,这意味着标记和实体引用在元素的内容中被忽略。 然而,在CDATAtypes的属性中,实体引用被replace。
在XML中#PCDATA是唯一的纯文本内容模型。 如果你想要允许元素中的文本内容,你可以使用它。 CDATA内容模型可以通过#PCDATA中的CDATA块标记显式使用,但是元素内容在默认情况下可能不会被定义为CDATA。
在DTD中,包含文本的属性的types必须是CDATA。 属性声明中的CDATA关键字与XML文档中的CDATA部分具有不同的含义。 在CDATA部分,所有字符都是合法的(包括<,>,&,和“字符),除了”]]>“结束标签。
#PCDATA不适合于属性的types。 它用于“叶子”文本的types。
由于历史原因,#PCDATA仅由一个哈希前缀。
从这里 ( Google是你的朋友 ):
在DTD中,PCDATA和CDATA分别用于断言元素和属性的允许内容。 在元素的内容模型中,#PCDATA表示元素包含(可能包含)“任何旧文本”。 (有如下所述的exception。)在一个属性的声明中,CDATA是一种可以放在属性允许值(其他types,所有互斥,包含ID,IDREF和NMTOKEN)上的约束。 允许值为CDATA的属性(如元素中的PCDATA)可以包含“任何旧文本”。
一个潜在的令人困惑的问题是,还有另一个 “CDATA”,也被称为标记的部分。 标记的部分是用特殊string分隔的元素(#PCDATA)内容的一部分:closures它。 如果您还记得PCDATA是“parsing字符数据”,那么CDATA部分实际上是相同的东西,没有“parsing”部分。 parsing器将标记的内容传输到下游应用程序,而不会每次遇到特殊字符(如<和&)时打嗝。 当你编写一个包含很多特殊字符的文档(比如脚本和代码片段)时,这是很有用的。 数据input更容易,阅读更容易,比相应的实体引用更容易。
因此,您可以推断,“任何旧文本”规则的例外是PCDATA不能包含任何这些未转义的特殊字符,除非它们属于CDATA标记的范围。
PCDATA – 分析的字符数据 。 它parsingXML文档中的所有数据。
例:
<family> <mother>mom</mother> <father>dad</father> </family>
在这里,家庭元素包含2个元素“母亲”和“父亲” 。 因此,进一步剖析父母的文本,把家庭的价值赋予“妈妈爸爸”
CDATA – 未分析的字符数据。 这是不应该在xml文档中进一步parsing的数据。
<family> <![CDATA[ <mother>mom</mother> <father>dad</father> ]]> </family>
在这里,家庭的价值将是<mother>mom</mother><father>dad</father>
。
PCDATA和CDATA之间的主要区别是
PCDATA – 基本上用于ELEMENTS
CDATA – 用于XML的属性,即ATTLIST
CDATA( C字符数据 ):与评论类似,但是是文件的一部分。 即CDATA是一个数据,它是文档的一部分,但数据不能用XMLparsing。
注:parsingXML时XML注释会被省略,但CDATA会按原样显示。
PCDATA(字符数据 ):默认情况下,一切都是PCDATA。 PCDATA是一个数据,它可以用XMLparsing。