2009-06-08 27 views
12

我使用從數據庫中提取的值創建XML文檔。有時由於遺留實現,我會撤回一個包含char的值,如果沒有正確轉義,該值將無效(例如,&)。何時CDATA與逃脫和副Versa?

所以問題變成了,應該是CDATA還是Escape?某些情況是否適合一個人而不是另一個?

例子:

<Email>foo&[email protected]</Email> 

我對CDATA瘦這裏。

<Name>Bob & Tom</Name> 

我會傾向於逃避在這裏。

我想避免每次都盲目CDATA,但從性能角度來看,這似乎是合乎邏輯的選擇。這將比尋找無效字符更快,如果它存在,然後換行。

想法?

回答

16

CDATA主要用於IMO,用於人類的可讀性。就機器而言,最多隻有CDATA和長度以外的文字沒有區別。也許逃跑的版本需要更長的時間來處理,但我說或許是,因爲這不應該是一個重要的因素,除非你的應用程序主要是IO綁定的。

人們可能正在閱讀XML嗎?如果沒有,只需讓XML解析器執行它的操作,不用擔心CDATA與轉義文本。如果人們會閱讀這個XML,那麼CDATA可能是更好的選擇。

如果您打算讓XML元素的值爲XML,那麼對於這種情況,CDATA可能是更好的選擇。

欲瞭解更多信息,請參見例如XML FAQ的問題,When should I use a CDATA Marked Section?

+1

CDATA對於需要轉義的較大字符串也更具網絡友好性,因此在大多數情況下,XML文件將通過網絡傳輸時應使用IMO。 – 2014-03-10 20:48:48

5

我見過的人使用CDATA的是OK的上方,用於包裝的東西是不屬於XML - 如例如JSON或CSS - 這是使用它的更好理由。當人們用它來引用基於元素的標記(如HTML)時會發生問題,然後發生混淆。

人們不指望

<![CDATA[<foo>bar</foo>]]> 

是相同

&lt;foo&gt;bar&lt;/foo&gt; 

儘可能XML系統的關注。

查看RSS標籤湯的逃跑層次恐怖的例子。

您還必須確保字符序列']]>'不會出現在您的包裝數據中,因爲這是終止符。

因此,除非可讀性至關重要,或者您正在包裝非元素標記,否則我建議避免CDATA。

0

總結與CDATA在這些條件: 如果你有doubtfull數據和你thnking逃避那些 數據用於顯示,因爲當時該應用程序也要去UNESCAPE。 重複轉義相同的數據元素 - 更多數量的解析&轉義會影響性能。

0

我認爲沒有真正的區別。我更喜歡使用CDATA來處理所有事情,因爲我不必關心要逃跑的角色,我唯一需要注意的就是內容中的「]]>」,如果將CDATA開頭並將標籤關閉成多個片段。

例子(PHP)

<?php 

function getXMLContent($content) 
{ 
    if 
    (
     (strpos($content, '<') !== false) || 
     (strpos($content, '>') !== false) || 
     (strpos($content, '&') !== false) || 
     (strpos($content, '"') !== false) || 
     (strpos($content, '\'') !== false) 
    ) 
    { 
     // If value contains ']]>', we need to break it into multiple CDATA tags 
     return "<![CDATA[". str_replace(']]>', ']]]]><![CDATA[>', $content) ."]]>"; 
    } 
    else 
    { 
     // Value does not contain any special characters which needs to be wrapped/encoded/escaped 
     return $content; 
    } 
} 

echo getXMLContent("Hello little world!"); 
echo PHP_EOL . PHP_EOL; 
echo getXMLContent("This <is> a & hard \" test ' for ]]> XML!"); 

?> 

返回

Hello little world! 

<![CDATA[This <is> a & hard " test ' for ]]]]><![CDATA[> XML!]]> 

如果你把成XML結構是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<test> 
    <![CDATA[This <is> a & hard " test ' for ]]]]><![CDATA[> XML!]]> 
</test> 

...保存它到一個文件(如test.xml)和ope ñ它與瀏覽器,你會看到,瀏覽器(或任何其他XML應用程序/解析器)會告訴你正確的輸出中的字符串:

This <is> a & hard " test ' for ]]> XML! 
0

我認爲CDATA會更快 - 它掃描結束字符,從頭到尾進行復制並將其傳回 - 一個副本。 在讀取轉義數據時,必須使用緩衝區,在掃描轉義字符時將其附加到緩衝區,並在緩衝區結束時將緩衝區轉換爲字符串並將其傳回。 因此,轉義將使用更多的內存,並將不得不做額外的副本。 雖然您可能只會注意到大量數據和大量事務的差異。所以,如果它的小領域,不要擔心它 - 也可以使用。