39

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

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

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

どのオプションを選択する必要がありますか?

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

4

11 に答える 11

39

2つのオプションはほとんど同じです。ここにあなたの2つの選択肢があります:

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

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

どちらの場合も、エスケープする特殊文字がないか文字列をチェックする必要があります。多くの人は、CDATA文字列をエスケープする必要がないふりをしますが、ご指摘のとおり、「]]>」がエスケープされていないことを確認する必要があります。

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

于 2009-09-09T10:59:41.800 に答える
12

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

于 2009-09-09T10:15:04.167 に答える
7

簡単にするためのCDATA。

于 2009-09-09T09:37:56.973 に答える
3

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のような変数にロードし、タグの2番目のオカレンス( item(1))のnodeValueを取得してデコードします。content

xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue

または(両方の表記は同等です)

xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
于 2013-12-06T16:26:59.417 に答える
1

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

于 2009-09-09T09:44:13.273 に答える
1

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

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

HTMLを実際にDOMに解析する場合は、HTMLテキストを読み取り、テストを個別に読み取るようにパーサーを設定することをお勧めします。

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

于 2009-09-09T10:04:17.767 に答える
1

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

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

于 2009-09-09T10:56:37.623 に答える
0

それをエンコードすると正常に動作し、信頼性があります。エンコードされたセクションなどを問題なくエンコードできます。

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

于 2009-09-09T09:38:44.027 に答える
0

答えは、HTMLコンテンツで何をする予定か、また、サポートする予定のHTMLコンテンツの種類によって異なると思います。

特にJavaScriptを含める場合、エンコードすると問題が発生することがよくあります。CDATAは間違いなくあなたを助けます。

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

于 2009-09-09T09:44:09.350 に答える
0

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

これは、htmlが自分で生成された場合にのみ実行できます。

于 2009-09-09T09:59:07.200 に答える
0

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

HTMLの名前空間を設定して、HTMLタグをそれをラップしている他のXMLから明確にすることができます。

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

于 2009-09-09T11:09:01.200 に答える