DTD中PCDATA与CDATA的区别

Jak*_*old 84 xml dtd

是什么区别#PCDATA,并#CDATADTD

Mat*_*nes 72

PCDATA - 解析的字符数据

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

CDATA - (未分析)字符数据

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

像"<"和"&"这样的字符在XML元素中是非法的.


Ros*_*one 71

  • PCDATA是将由解析器解析的文本.文本中的标签将被视为标记,实体将被扩展.
  • CDATA是解析器不会解析的文本.文本中的标签 不会被视为标记,实体也不会被展开.

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

<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>
Run Code Online (Sandbox Code Playgroud)

当我们想要指定一个元素只包含文本而没有子元素时,我们使用关键字PCDATA,因为该关键字指定该元素必须包含可解析的字符数据 - 即除了字符小于(< ),大于(>),&符号(&),引号(')和双引号(").

在下一个示例中,CDATA包含CDATA.它的内容将不会被解析,因此PCDATA.

<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

#PCDATA不适合属性的类型.它用于"叶子"文本的类型.

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

  • 很棒的答案,除了最后一句.```不是标签.只有前面带有此符号的标记才是标签.符号本身有[许多名称](https://en.wikipedia.org/wiki/Number_sign#Other_names_in_English),包括"数字符号","英镑符号"(主要是加拿大和美国),或者只是"哈希"(因此)名称'#标签'). (5认同)
  • #justhadtogetthatoffmychest (5认同)
  • 我不同意`#PCDATA`前面的#出于历史原因.它存在是因为在DTD中,一个元素也可以包含一个名为`PCDATA`的元素,这个元素必须是可能的,它看起来像`<!ELEMENT foo(PCDATA)>`. (3认同)

Oli*_*Oli 11

从这里(谷歌是你的朋友):

在DTD中,PCDATA和CDATA分别用于断言关于元素和属性的允许内容的某些内容.在元素的内容模型中,#PCDATA表示该元素包含(可能包含)"任何旧文本".(如下所示的例外情况.)在属性的声明中,CDATA是一种可以放在属性允许值上的约束(其他排序,所有互斥,包括ID,IDREF和NMTOKEN).允许值为CDATA的属性(如元素中的PCDATA)包含"任何旧文本".

一个可能真正令人困惑的问题是,还有另一个 "CDATA",也称为标记部分.标记的部分是使用特殊字符串分隔的元素(#PCDATA)内容的一部分:关闭它.如果你还记得PCDATA是"已解析的字符数据",那么CDATA部分就完全相同,没有"已解析".解析器将标记部分的内容传输到下游应用程序,而不会在每次遇到像<和&等特殊字符时打嗝.当您编写包含许多特殊字符(如脚本和代码片段)的文档时,这非常有用; 与相应的实体引用相比,它更容易进行数据输入,并且更易于阅读.

因此,您可以推断出"任何旧文本"规则的例外情况是PCDATA不能包含任何这些未转义的特殊字符,除非它们属于CDATA标记部分的范围.


win*_*ter 11

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

例:

<family>
    <mother>mom</mother>
    <father>dad</father>
</family>
Run Code Online (Sandbox Code Playgroud)

这里,family元素包含2个元素"mother""father".所以它进一步解析得到母亲和父亲的文本给家庭的价值作为"妈妈爸爸"

CDATA - 未分析的追踪数据.这是不应在xml文档中进一步解析的数据.

<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>
Run Code Online (Sandbox Code Playgroud)

在这里,家庭的价值将是<mother>mom</mother><father>dad</father>.