XMLを使用してHTMLコンテンツを共有しています。知る限り、次のいずれかの方法でHTMLを埋め込むことができます。
エンコード:使用しても安全かどうかわかりません。そして、もう一度デコードする必要があります。
CDATAセクションを使用する:コンテンツに終了タグ「]]>」と特定の16進文字が含まれていると、問題が発生する可能性があります。一方、XMLパーサーは情報を透過的に抽出します。
どのオプションを選択すればよいですか?
更新:xmlはJavaで作成され、.net Webサービスに文字列として渡されます。解析された場合、XMLを文字列としてエクスポートできる必要があります。 「doc.LoadXml(xmlString);」を使用してロードします
2つのオプションはほぼ同じです。次の2つの選択肢があります。
<html>This is <b>bold</b></html>
<html><![CDATA[This is <b>bold</b>]]></html>
どちらの場合も、エスケープする特殊文字の文字列を確認する必要があります。多くの人は、CDATA文字列をエスケープする必要がないと見せかけますが、指摘するように、「]]>」がエスケープされずにスリップしないようにする必要があります。
どちらの場合も、XMLプロセッサーはデコードされた文字列を返します。
CDATAは目で読むのが簡単ですが、エンコードされたコンテンツにはCDATAの終了マーカーを安全に含めることができますが、気にする必要はありません。 XMLライブラリを使用するだけで、心配する必要はありません。次に、「この要素内にこのテキストを配置する」だけで、ライブラリはそれをエンコードするか、CDATAマーカーでラップします。
簡単にするためのCDATA。
CDATAを使用する場合は、正しくデコードする必要があります(textContent、value、innerHTMLは、適切なデータを返さないメソッドです)。
次のようなxml構造を使用するとします。
_<response>
<command method="setcontent">
<fieldname>flagOK</fieldname>
<content>479</content>
</command>
<command method="setcontent">
<fieldname>htmlOutput</fieldname>
<content>
<![CDATA[
<tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:55</td><td align='right'>113</td><td align='right'>NE</td><td align='right'>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&iwloc=A&t=h&z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:56</td><td align='right'>112</td><td align='right'>NE</td><td align='right'>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&iwloc=A&t=h&z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 18:00</td><td align='right'>111</td><td align='right'>SE</td><td align='right'>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&iwloc=A&t=h&z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
]]>
</content>
</command>
</response>
_
javascriptでは、xml(jqueryなど)を以下のxmlDocのような変数に読み込み、content
タグの2番目の出現(item(1)
)のnodeValueを取得することでデコードします。
_xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue
_
または(両方の表記は同等です)
_xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
_
使用しているXMLビルダーはわかりませんが、PHP(実際にはlibxml)は]]>
CDATAセクション内。他のすべてのXMLフレームワークも同様です。そのため、CDATAセクションを使用します。
HTMLをCDATAでラップすることは理にかなっています。 HTMLテキストは、おそらくXMLの単一の値で構成されます。
したがって、CDATAでラップしないと、すべてのxmlパーサーがXMLドキュメントの一部としてそれを読み取ることになります。 xmlの使用中にこの問題を回避するのは簡単ですが、なぜ余分な頭痛の種がありますか?
実際にHTMLをDOMに解析する場合は、HTMLテキストを読み取り、テストを個別に読み取るようにパーサーをセットアップする方が適切です。
それが私が意図したとおりに出たことを願っています。
個人的には、CDATAセグメントが嫌いなので、代わりにエンコードを使用します。もちろん、XMLをXMLからXMLに追加すると、エンコードがエンコードよりもエンコードになり、非常に読みにくい結果になります。 CDATAセグメントが嫌いなのはなぜですか?知っていれば良かった。主に個人的な好み。突然再び許可される特別なセグメント内に「禁止された文字」を追加することに慣れるのが好きではありません。 CDATAセグメント内にXMLマークアップが表示され、それを取り巻くXMLの一部ではない場合、混乱させられます。少なくともエンコードでは、エンコードされていることがわかります。
優れたXMLライブラリは、エンコードセグメントとCDATAセグメントの両方を透過的に処理します。けがをするのは私の目だけです。
エンコードは問題なく機能し、信頼性があります。エンコードされたセクションなどを簡単にエンコードできます。
デコードは、エンコードされたHTMLの処理に使用されるXMLパーサーによって自動的に実行されます。
答えは、あなたがhtmlコンテンツで何をするつもりなのか、またあなたがどのタイプのhtmlコンテンツをサポートするのかによって決まると思います。
特に、含まれるjavascriptに関しては、エンコードはしばしば問題を引き起こします。 CDATAは間違いなくあなたを助けます。
小さなスニペット(つまり段落)のみを使用し、前処理/フィルタリングする方法がある場合(oyuはjavascriptや派手なものを必要としないため)、おそらくエンコーディングを使用するか、実際に直接配置することをお勧めしますxmlのサブツリー。その後、htmlを後処理することもできます(つまり、フィルタースタイルまたはonclick属性)。しかし、これは間違いなくより多くの作業です。
両方を組み合わせて使用できます。例:<h1>....</h1>
をxmlノードに渡したい場合、CDATAセクションを使用して渡します。 <h1>...</h1>
内のコンテンツは、たとえば<
、<
の場合。タグ間のエンコードにより、]]>が]]>
に変換され、htmlタグに]]>
が含まれないため、解釈されないという問題が解決されます。
これは、htmlが自分で生成された場合にのみ可能です。
HTMLが整形式の場合は、CDTATAでエスケープまたはラップせずにHTMLタグを埋め込むだけです。可能な限り、XMLでコンテンツを保持するのに役立ちます。これにより、ドキュメントをより柔軟に変換および操作できます。
HTMLの名前空間を設定して、HTMLタグをラップする他のXMLと区別することができます。
エスケープされたテキストは、HTMLブロック全体が1つの大きなテキストノードになることを意味します。 CDATAでラップすると、XMLパーサーはそのセクションを解析しません。 「簡単」かもしれませんが、能力の範囲を制限し、適切な場合にのみ使用する必要があります。便利だからというだけではありません。 エスケープされたマークアップは有害と見なされます。