DTD中PCDATA与CDATA的区别

时间:2009-05-27 23:18:07

标签: xml dtd

DTD #PCDATA#CDATA之间的区别是什么?

6 个答案:

答案 0 :(得分:70)

PCDATA - 解析字符数据

XML解析器通常会解析XML文档中的所有文本。

CDATA - (未分析)字符数据

术语CDATA用于不应由XML解析器解析的文本数据。

像“<”这样的字符和“&”在XML元素中是非法的。

答案 1 :(得分:67)

  • PCDATA是将由解析器解析的文本。文本内的标签 将被视为标记,实体将被扩展。
  • CDATA是解析器解析的文本。文本里面的标签会 被视为标记,实体不会被扩展。

默认情况下,一切都是PCDATA。在以下示例中,忽略根,<bar>将被解析,并且它将没有内容,而是一个子节点。

<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>

当我们想要指定一个元素只包含文本而没有子元素时,我们使用关键字PCDATA,因为该关键字指定该元素必须包含可解析的字符数据 - 即除了字符之外的任何文本 - 比(&lt;),大于(&gt;),&符号(&amp;),引号(')和双引号(“)。

在下一个示例中,<bar>包含CDATA。它的内容不会被解析,因此<test>content!</test>

<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>

SGML中有几种内容模型。 #PCDATA内容模型表示元素可能包含纯文本。它的“解析”部分意味着它中的标记(包括PI,注释和SGML指令)被解析而不是显示为原始文本。它还意味着实体引用被替换。

允许纯文本内容的另一种内容模型是CDATA。在XML中,元素内容模型可能不会隐式设置为CDATA,但在SGML中,它意味着在元素的内容中忽略标记和实体引用。但是,在CDATA类型的属性中,实体引用被替换。

在XML中#PCDATA是唯一的纯文本内容模型。如果您想要允许元素中的文本内容,则使用它。 CDATA内容模型可以通过#PCDATA中的CDATA块标记显式使用,但元素内容可能不会默认定义为CDATA。

在DTD中,包含文本的属性类型必须是CDATA。属性声明中的CDATA关键字与XML文档中的CDATA部分具有不同的含义。在CDATA部分,所有字符都是合法的(包括&lt;,&gt;,&amp;,'和'字符),但“]]&gt;”结束标记除外。

#PCDATA不适合属性的类型。它用于“叶子”文本的类型。

由于历史原因,#PCDATA前缀为哈希。

答案 2 :(得分:11)

From hereGoogle is your friend):

  

在DTD中,PCDATA和CDATA用于   断言关于允许的东西   元素和属性的内容,   分别。在元素的内容中   模型,#PCDATA表示该元素   包含(可能包含)“任何旧文本”。   (如下所述的例外情况。)在   一个属性的声明,CDATA是   你可以提出的一种约束   属性的允许值   (其他种类,所有相互排斥,   包括ID,IDREF和NMTOKEN)。一个   允许值为的属性   CDATA可以(像元素中的PCDATA)   包含“任何旧文本。”

     

可能真正令人困惑的问题   那是另一个“CDATA”   也称为标记部分。一个   标记部分是元素的一部分   (#PCDATA)内容用。分隔   特殊字符串:关闭它。如果你   记住PCDATA是“解析的   字符数据,“CDATA部分是   字面上是一样的,没有   “解析”。解析器传输内容   标记的部分到下游   应用程序没有打扰每一个   他们遇到特殊角色的时间   喜欢&lt;和&amp ;.这很有用   你正在编写一个包含的文档   很多那些特殊的角色(比如   脚本和代码片段);它的   更容易数据输入,更容易   阅读,比相应的实体   参考

     

所以你可以推断出异常   “任何旧文本”规则就是PCDATA   不能包括任何这些未转义的   特殊人物,除非他们堕落   在CDATA标记范围内   部分。

答案 3 :(得分:9)

PCDATA - 已解析的字符数据。它解析xml文档中的所有数据。

示例:

<family>
    <mother>mom</mother>
    <father>dad</father>
</family>

这里,family元素还包含2个 元素“母亲”“父亲”。所以它进一步解析得到母亲和父亲的文本给予家庭的价值“妈妈爸爸”

CDATA - 未分析的已分析数据。这是数据 不应该在xml文档中进一步解析。

<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>

此处,系列的值为<mother>mom</mother><father>dad</father>

答案 4 :(得分:3)

PCDATA和CDATA之间的主要区别是

PCDATA - 基本上用于ELEMENTS,而

CDATA - 用于XML的属性,即ATTLIST

答案 5 :(得分:0)

CDATA( C 字符数据):与评论类似,但它是文档的一部分。即CDATA是一个数据,它是文档的一部分,但数据无法用XML解析 注意: XML语句在解析XML时忽略,但CDATA显示为原样。

PCDATA( P arsed C haracter DATA ):默认情况下,所有内容都是PCDATA。 PCDATA是一种数据,可以用XML进行解析。