Mat*_*nes 72
PCDATA - 解析的字符数据
XML解析器通常解析XML文档中的所有文本.
CDATA - (未分析)字符数据
术语CDATA用于不应由XML解析器解析的文本数据.
像"<"和"&"这样的字符在XML元素中是非法的.
Ros*_*one 71
默认情况下,一切都是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前缀为哈希.
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>
.