2009-06-08 4 views
12

DBから値をフェッチしてXML文書を作成しています。時々、従来の実装のために、私は適切にエスケープされていないとき無効なcharを含む値を取り戻します(&など)。CDATA vs. Escape&Vice Versaはいつですか?

私はCDATAまたはEscapeを使用する必要がありますか?特定の状況は、他の状況に対してより適切ですか?

例:

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

私はここにCDATAの方に傾くと思います。

<Name>Bob & Tom</Name> 

私はここで逃げようとしています。

私は盲目的に毎回CDATAを実行しないようにしたいのですが、パフォーマンスの観点から見ると論理的な選択だと思われます。それは常に無効なcharを探すより速くなり、存在する場合はラップします。

思考?

答えて

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は、エスケープする必要のある大きな文字列の方がネットワークに優しいため、IMOは、XMLファイルがネットワーク経由で送信されるほとんどの場合に使用する必要があります。 –

5

私は人々がOKである上記のためにCDATAを使用して、物事をラップするためにXMLものではありません見てきた - などの例JSONまたはCSSを使用している方が良い理由です。 HTMLなどの要素ベースのマークアップを引用するときに問題が発生し、混乱が発生します。

人々は

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

は限りXMLシステムは懸念しているよう

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

と同一であることを期待しないでください。

エスケープレベルの恐怖の例として、RSSタグスープを参照してください。

また、文字シーケンス ']]>'がラップされたデータに表示されないようにする必要があります。

読みやすさが重要でないか、要素以外のマークアップをラップしていない場合は、CDATAを避けることをおすすめします。

0

これらの条件でCDATAで折り返します。 疑わしいデータがあり、それらをエスケープしている場合 データが表示に使用されます。そのデータもエスケープされるためです。 同じデータ要素を繰り返しエスケープします - 解析回数が多いほど&のエスケープがパフォーマンスに影響します。

0

実際の違いはないと思います。私はエスケープする文字を気にする必要がないので、私はすべての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 nはそのブラウザでは、ブラウザ(または他のXMLアプリケーション/パーサは)あなたに正しい出力に含まの文字列が表示されますことを、わかります

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

私はCDATAが速くなると思う - それはスキャンする必要があります終わりの文字、最初から最後までコピーを作成し、そのコピーを1つのコピーに渡します。 エスケープされたデータの読み込みでは、バッファを使用し、エスケープされた文字をスキャンするときに追加し、終了したらバッファを文字列に変換して戻します。 したがって、エスケープ処理ではさらに多くのメモリが使用されるため、余分なコピーが必要になります。 大量のデータセットと多数のトランザクションの違いだけに気づくでしょう。だから、小さなフィールドの場合は、それを心配しないでください。

関連する問題