HTMLでエンティティとしてレンダリングされるように、XMLでアンパサンドをエスケープするにはどうすればよいですか?


523

HTMLページにレンダリングしたいXMLテキストがあります。このテキストにはアンパサンドが含まれています。これをエンティティ表現でレンダリングします&

ソースXMLでこのアンパサンドをエスケープするにはどうすればよいですか?私が試しました&が、これは実際のアンパサンド文字(&)としてデコードされます。これはHTMLでは無効です。

したがって&、XML出力を使用するWebページのようにレンダリングされるようにエスケープしたいと思います。


1
この質問の最新の改訂における「実際のアンパサンド文字(&)...はHTMLでは無効です」という主張。は偽です。実際、正当化として提供されたリンクされた質問に対する受け入れられた回答でさえ、「HTML5ではエスケープせずに残すことができますが、後続のデータが有効な文字参照のように見えない場合のみ」と記載されています。
Mark Amery 2016

回答:


422

XMLにが含まれている場合&、これはテキストになります&

これをHTMLで使用すると、としてレンダリングされ&ます。


195

XML 1.0仕様の§2.4、あなたが使用することができるはずです&

試しました しかし、これは許可されていません。

別の問題ではないですか?XMLでは、これをアンパサンドをエスケープする方法として明示的に定義しています。


3
これは投稿されたときは完全に合理的でしたが、質問に対する変更(またはおそらく説明)は回答として無意味に思われるようになったためです。一つには、引用された一節はもはや質問に存在しません。
Mark Amery 2016

133

&ソリューションがためにそれとUnicode小数相当を連結しているので、文字はXMLでエスケープ文字そのものである&ため、何のXML解析エラーがないことを保証します。つまり、文字&をに置き換え&ます。


5
私は本当にこの解決策を好む!また、16進数を使用することが可能であるべきである:&
CodeManX

2
論理的には、なぜこれが機能するのでしょうか?両方の文字列にはアンパサンドがあり、最後に文字コードが付いているものも含まれます...
sijpkes

4
@sijpkesここのアンパサンドは、次の文字が別の文字(この場合はアンパサンド)を表すために使用されることをパーサーに伝えているためです。アンパサンドはXMLでは「違法」ではありません-特別な意味を持つだけです。これは、「この後、セミコロンを押すまでのすべての文字は別のものに翻訳する必要がある」という意味です。アンパサンドが通常あり、説明文字と末尾のセミコロンがない場合、パーサーは混乱します。
ライリー少佐

1
これが私の答えです。&を追加しています 私の応答ヘッダーの場所でそれを修正し、応答ヘッダーにアンパサンドを表示していません。:D
iamjoshua

スタックオーバーフローは素晴らしいです。ここに私の問題を解決するほぼ11年前の投稿があります。そして、69万回以上視聴されています。
ビル・

69

CDATAタグを使用:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>

4
これは答えではなく推測です。
Bryan Oakley、

10
それは推測かもしれません。それは正しいです。CDATAマーカーを使用すると、未加工のアンパサンドを使用できます。
クエンティン

19
&が使用される場所が元の投稿で明らかにされなかったため、CDATAタグは属性値に使用できず、タグの実際のコンテンツに対してのみ使用できるため、「?」を含めた理由です。
scragar 2009

1
これはxmlデータの特性評価にも最適です。この回答は、xmlレンダリングに関する他の多くのシナリオで役立ちます。私にとっては、Camel XML DSLで本当に役立ちました。XMLデータを含むボディまたはヘッダーを設定する必要がある場合、Camel XMLパーサーはCDATAコンテンツを無視し、文字のストリームとして読み取りました。これがないと、キャメルエンジンが無効なxml構造の例外をスローします
Kimutai

1
私の場合、XMLに含まれる文字がわからないため、このセクションのすべてをエスケープする必要があるため、これはまさに私が必要とした答えです。
Matt


11

私の場合、それをに変更する必要がありました%26

&URLでエスケープする必要がありました。だから&amp;私のためにうまくいきませんでした。でurlencodeの機能が変更&%26。この方法では、XMLもブラウザのURLメカニズムもURLについて不満を述べませんでした。


8
はい。ただし、OPはXMLでエスケープすることに注意してください。URLのエスケープは別の問題です。実際の楽しみは、URLがXMLであるか、XMLフラグメントがURLであるときに始まります...
Oskar Berggren

6

&ampを試しましたが、うまくいきませんでした。Wim ten Brinkの回答に基づいて、私は&amp; ampを試しましたが、うまくいきました。

私の仲間の開発者の1人が&#x26;の使用を提案しました。そしてそれは何回レンダリングされるかに関わらず機能しました。


5

&amp; XMLドキュメントのほとんどのセクションでアンパサンドを表す方法です。

HTML内にXMLを表示したい場合は、まず適切にエンコードされたXML(これをに変更&することを含む&amp;)を作成してから、それを使用して適切にエンコードされたHTMLを作成する必要があります(これもに変更&する必要があります&amp;)。その結果:

&amp;amp;

XMLエンコーディングの詳細については、以下を参照してください。

XMLドキュメントでエスケープする必要がある文字は何ですか?


4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> トリックを行います。


3

ユニコードを使用するのはどう\u0026ですか?私のandroid XMLファイルで機能します。問題が発生した場合、誰かが私に知らせました。


1
\uエスケープは、一般的にXMLでは特別な意味を持ちません。-1。
Mark Amery 2016

@MarkAmeryはい、それらには特別な意味はありません。そのため、正確に機能するのはそのためです。解釈するものは何もないので、問題はありません。Javaはユニコードを解釈し、OPが望むようにアンパサンドを表示します。
Scott Biggs

1
@ScottBiggs OPの質問でJavaは何をしますか?
フィリップアンドレロリン

1
@ScottBiggsだから、それは話題外です。− 1.
フィリップアンドレロリン

1
@ScottBiggsそれがあなたのために働くという事実、そして他の人が利益を得るかもしれないという事実は、無関係です。あなたの答えは他のすべての読者にとってノイズです。それはOPが尋ねたより一般的なケースを扱っていないからです。これはあなたの成功を共有しないことについてではありません。これは、所属する場所に保管することです。あなたの貢献は役に立つかもしれませんが、ここでは答えとして提示されていません。おそらくコメントとして、あるいは別の質問への回答としてかもしれません(自由に作成して自分で回答できます)。
フィリップアンドレロリン

0

XMLが以下のようになっているかどうかを検討してください。

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF'
  <Query>
</Employees>

<>エラーをスローするため、直接使用することはできません。その場合、&#60;&#62;代わりにご利用いただけます。

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF'
  <Query>
</Employees>

すべてのコードを表示するには、ここをクリックしてください。


2
この根拠は、この回答が投稿される前の7年間で十分にカバーされたと思います。
miken32
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.