web-dev-qa-db-ja.com

XML内のHTML。 CDATAを使用するか、HTMLをエンコードする必要がありますか

XMLを使用してHTMLコンテンツを共有しています。知る限り、次のいずれかの方法でHTMLを埋め込むことができます。

  • エンコード:使用しても安全かどうかわかりません。そして、もう一度デコードする必要があります。

  • CDATAセクションを使用する:コンテンツに終了タグ「]]>」と特定の16進文字が含まれていると、問題が発生する可能性があります。一方、XMLパーサーは情報を透過的に抽出します。

どのオプションを選択すればよいですか?

更新:xmlはJavaで作成され、.net Webサービスに文字列として渡されます。解析された場合、XMLを文字列としてエクスポートできる必要があります。 「doc.LoadXml(xmlString);」を使用してロードします

35
alberto

2つのオプションはほぼ同じです。次の2つの選択肢があります。

<html>This is &lt;b&gt;bold&lt;/b&gt;</html>

<html><![CDATA[This is <b>bold</b>]]></html>

どちらの場合も、エスケープする特殊文字の文字列を確認する必要があります。多くの人は、CDATA文字列をエスケープする必要がないと見せかけますが、指摘するように、「]]>」がエスケープされずにスリップしないようにする必要があります。

どちらの場合も、XMLプロセッサーはデコードされた文字列を返します。

30
Ned Batchelder

CDATAは目で読むのが簡単ですが、エンコードされたコンテンツにはCDATAの終了マーカーを安全に含めることができますが、気にする必要はありません。 XMLライブラリを使用するだけで、心配する必要はありません。次に、「この要素内にこのテキストを配置する」だけで、ライブラリはそれをエンコードするか、CDATAマーカーでラップします。

12
Quentin

簡単にするためのCDATA。

7
Mohamed

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&amp;iwloc=A&amp;t=h&amp;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&amp;iwloc=A&amp;t=h&amp;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&amp;iwloc=A&amp;t=h&amp;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
_
3
tony gil

使用しているXMLビルダーはわかりませんが、PHP(実際にはlibxml)は]]> CDATAセクション内。他のすべてのXMLフレームワークも同様です。そのため、CDATAセクションを使用します。

1
Ionuț G. Stan

HTMLをCDATAでラップすることは理にかなっています。 HTMLテキストは、おそらくXMLの単一の値で構成されます。

したがって、CDATAでラップしないと、すべてのxmlパーサーがXMLドキュメントの一部としてそれを読み取ることになります。 xmlの使用中にこの問題を回避するのは簡単ですが、なぜ余分な頭痛の種がありますか?

実際にHTMLをDOMに解析する場合は、HTMLテキストを読み取り、テストを個別に読み取るようにパーサーをセットアップする方が適切です。

それが私が意図したとおりに出たことを願っています。

1
jrharshath

個人的には、CDATAセグメントが嫌いなので、代わりにエンコードを使用します。もちろん、XMLをXMLからXMLに追加すると、エンコードがエンコードよりもエンコードになり、非常に読みにくい結果になります。 CDATAセグメントが嫌いなのはなぜですか?知っていれば良かった。主に個人的な好み。突然再び許可される特別なセグメント内に「禁止された文字」を追加することに慣れるのが好きではありません。 CDATAセグメント内にXMLマークアップが表示され、それを取り巻くXMLの一部ではない場合、混乱させられます。少なくともエンコードでは、エンコードされていることがわかります。

優れたXMLライブラリは、エンコードセグメントとCDATAセグメントの両方を透過的に処理します。けがをするのは私の目だけです。

1
Wim ten Brink

エンコードは問題なく機能し、信頼性があります。エンコードされたセクションなどを簡単にエンコードできます。

デコードは、エンコードされたHTMLの処理に使用されるXMLパーサーによって自動的に実行されます。

0
Brian Agnew

答えは、あなたがhtmlコンテンツで何をするつもりなのか、またあなたがどのタイプのhtmlコンテンツをサポートするのかによって決まると思います。

特に、含まれるjavascriptに関しては、エンコードはしばしば問題を引き起こします。 CDATAは間違いなくあなたを助けます。

小さなスニペット(つまり段落)のみを使用し、前処理/フィルタリングする方法がある場合(oyuはjavascriptや派手なものを必要としないため)、おそらくエンコーディングを使用するか、実際に直接配置することをお勧めしますxmlのサブツリー。その後、htmlを後処理することもできます(つまり、フィルタースタイルまたはonclick属性)。しかし、これは間違いなくより多くの作業です。

0
Niko

両方を組み合わせて使用​​できます。例:<h1>....</h1>をxmlノードに渡したい場合、CDATAセクションを使用して渡します。 <h1>...</h1>内のコンテンツは、たとえば&lt;<の場合。タグ間のエンコードにより、]]>が]]&gt;に変換され、htmlタグに]]>が含まれないため、解釈されないという問題が解決されます。

これは、htmlが自分で生成された場合にのみ可能です。

0
Xinus

HTMLが整形式の場合は、CDTATAでエスケープまたはラップせずにHTMLタグを埋め込むだけです。可能な限り、XMLでコンテンツを保持するのに役立ちます。これにより、ドキュメントをより柔軟に変換および操作できます。

HTMLの名前空間を設定して、HTMLタグをラップする他のXMLと区別することができます。

エスケープされたテキストは、HTMLブロック全体が1つの大きなテキストノードになることを意味します。 CDATAでラップすると、XMLパーサーはそのセクションを解析しません。 「簡単」かもしれませんが、能力の範囲を制限し、適切な場合にのみ使用する必要があります。便利だからというだけではありません。 エスケープされたマークアップは有害と見なされます。

0
Mads Hansen