博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

xhtml cdata

Posted on 2012-10-30 11:07  bw_0927  阅读(464)  评论(0)    收藏  举报

http://xuqin.blog.51cto.com/5183168/887799

http://www.dedecms.com/knowledge/web-based/html/2009/0929/883.html

http://www.w3school.com.cn/xml/xml_cdata.asp

 

近来,随着XHTML(可扩展HTML)标准的出现,<script/>标签也经历了一些改变。该标签不再用language特性,而用type特性声明内嵌代码或要加入的外部文件的mime类型,JavaScript的mime类型是"text/javascript"。例如:

<html>  
 <head>  
 <title>Title of Page</title>  
 <script type=”text/javascript”>  
 var i = 0;   
 </script>  
 <script type=”text/javascript” src=”../scripts/external.js”></script>  
 </head>  
 <body>  
 <!-- body goes here -->  
 </body>  
</html> 

  即使许多浏览器不完全支持XHTML,但大多数开发者现在都用type特性,而不用language特性,以提供更好的XHTML支持。省略language特性不会带来任何问题,因为如前所述,所有浏览器都默认<script/>的该属性值为JavaScript。

  XHTML的第二个改变是使用CDATA段。XML中的CDATA段用于声明不应被解析为标签的文本(XHTML也是如此),这样就可以使用特殊字符,如小于(<)、大于(>)、和号(&)和双引号("),而不必使用它们的字符实体。考虑下面的代码:

<SCRIPT type=”text/javascript”>  
 function compare(a, b) {  
 if (a < b) {  
 alert(“A is less than B”);  
 } else if (a > b) {  
 alert(“A is greater than B”);  
 } else {  
 alert(“A is equal to B”);  
 }  
}  
</SCRIPT> 

  这个函数相当简单,它比较数字a和b,然后显示消息说明它们的关系。但是,在XHTML中,这段代码是无效的,因为它使用了三个特殊符号,即小于、大于和双引号。要修正这个问题,必须分别用这三个字符的XML实体<、>和"替换它们:

<SCRIPT type=”text/javascript”>  
function compare(a, b) {  
if (a < b) {  
alert("A is less than B");  
} else if (a > b) {  
131  
JavaScript in the Browser  
alert("A is greater than B");  
} else {  
alert("A is equal to B");  
}  
}  
</SCRIPT> 

  这段代码存在两个问题。首先,开发者不习惯用XML实体编写代码。这使代码很难读懂。其次,在JavaScript中,这种代码实际上将视为有语法错,因为解释程序不知道XML实体的意思。用CDATA段即可以以常规形式(即易读的语法)编写JavaScript代码。正式加入CDATA段的方法如下:

<SCRIPT type=”text/javascript”>
<![CDATA[  
function compare(a, b) {  
if (a < b) {  
alert(“A is less than B”);  
} else if (a > b) {  
alert(“A is greater than B”);  
} else {  
alert(“A is equal to B”);  
}  
}  
]]>
</SCRIPT>

  虽然这是正式方式,但还要记住,大多数浏览器都不完全支持XHTML,这就带来主要问题,即这在JavaScript中是个语法错误,因为大多数浏览器还不认识CDATA段。

  当前使用的解决方案模仿了“对旧浏览器隐藏”代码的方法。使用单行的JavaScript注释,可在不影响代码语法的情况下嵌入CDATA段:

<SCRIPT type=”text/javascript”>  
//<![CDATA[  
function compare(a, b) {  
if (a < b) {  
alert(“A is less than B”);  
} else if (a > b) {  
alert(“A is greater than B”);  
} else {  
alert(“A is equal to B”);  
}  
}  
//]]>  
</SCRIPT>

==========================

所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data)。

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

当某个 XML 元素被解析时,其标签之间的文本也会被解析:

<message>此文本也会被解析</message>

解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 <name> 元素包含着另外的两个元素(first 和 last):

<name><first>Bill</first><last>Gates</last></name>

而解析器会把它分解为像这样的子元素:

<name>
   <first>Bill</first>
   <last>Gates</last>
</name>

转义字符

非法的 XML 字符必须被替换为实体引用(entity reference)。

假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:

<message>if salary < 1000 then</message>

为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:

<message>if salary &lt; 1000 then</message>

在 XML 中有 5 个预定义的实体引用:

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 省略号
&quot; " 引号

注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

CDATA

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>
</script>

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。

关于 CDATA 部分的注释:

CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

====================

PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 & < > 字符;需要使用 &amp; &lt; &gt; 实体来分别替换它们。


CDATA
CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
几个实体引用字符
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '


又有网上有人这样说,我觉得挺直观,先转过来:
PCDATA表示已解析的字符数据。
CDATA不通过解析器进行解析的文本,文本中的标签不被看作标记。CDATA表示里面是什么数据XML不会解析,比如

  1. <![CDATA[ 
  2. if(a>b){ 
  3. System.out.println(a); 
  4. } 
  5. ]]> 


注意上面的a与b之间的 > 符号.

PCDATA的数据是要给xml解析器去解析的,那上面的>去解析肯定会出错了,所以要用实体定义。上面的数据如果用PCDATA表示应该如下:

  1. if(a&gt;b){  
  2. System.out.println(a);  
  3. }


CDATA是在XML文档里面使用的关键字,用来告诉浏览器,这部分内容不用解析,是给其他程序用的,比如js代码等。CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

  1. <script>  
  2. <![CDATA[  
  3. function matchwo(a,b){  
  4. if (a < b && a < 0){  
  5. return 1;  
  6.  
  7. else{  
  8. return 0;  
  9.  
  10.  
  11. ]]>  
  12. </script>  

#PCDATA是在 XML约束文档里使用的,如DTD类型的约束文档,在这里面表示元素的内容或属性的取值范围等等,是字符串形式的

  1. <?xml version="1.0"?> 
  2. <!DOCTYPE note [ 
  3.   <!ELEMENT note (to,from,heading,body)> 
  4.   <!ELEMENT to      (#PCDATA)> 
  5.   <!ELEMENT from    (#PCDATA)> 
  6.   <!ELEMENT heading (#PCDATA)> 
  7.   <!ELEMENT body    (#PCDATA)> 
  8. ]> 
  9. <note> 
  10.   <to>George</to> 
  11.   <from>John</from> 
  12.   <heading>Reminder</heading> 
  13.   <body>Don't forget the meeting!</body> 
  14. </note> 


关于实体引用,转载了一篇文章解释的比较好:
通过字符和实体引用,可以通过引用将信息加入 XML 文档,而不必直接在文档中键入字符。在下列情况下,这样做很有用:
因为会被解释为标记,字符无法直接输入文档。
因为输入设备的限制,字符无法直接输入文档。
字符无法通过限于单字节字符的处理器可靠地传输。字符串或文档片断反复出现,并且可以缩写。为了显示内容,XML 提供了许多语法构造,以“and”符 (&) 开头,以分号 (;) 结尾。
通过字符引用,可以插入通过指向 Unicode 代码点的数字标识的 Unicode 字符。代码点可以使用十进制或十六进制表示法标识。
用于十进制引用的语法:    &#value;
用于十六进制引用的语法:  &#xvalue;

例如,要插入欧元符号,许多键盘上仍没有该字符,可以将 &#x20AC; 或 &#8364; 插入文档。
下表为 XML 标记使用的字符列出了五种内置实体。实体 实体引用 含义

实体实体引用含义
lt
&lt;
<(小于号)
gt
&gt;
>(大于号)
amp
&amp;
&(“and”符)
apos
&apos;
'(撇号或单引号)
quot
&quot;
"(双引号)


如果字符可能会使 XML 分析器错误地解释文档结构,请使用实体,而不要键入字符。&apos; 和 &quot; 实体引用最常用在属性值中。

 

 

例一: 双引号的使用。

 

 

 

双引号作为XML 属性值的开始结束符号,因此无法在值中直接使用"". 处理方式可以分为两种。

 

 

 a: 属性值中没有'(单引号) ,那么可以用单引号'' 作为属性值的开始结束符号

 

 

<add key="IPhone" value="apple"/>  ...属性值为 ("apple").

 

 

解决:  <add key="IPhone" value=’"apple"‘/> 

 

 

 b: 属性值中有'(单引号) ,也有双引号。 如...属性值为 ("'apple").

<add key="IPhone" value="&quot;&apos;apple&quot;"/>