web-dev-qa-db-ja.com

XML文書でエスケープする必要がある文字は何ですか?

XML文書ではエスケープしなければならない文字は何ですか?そのようなリストはどこにありますか?

853
Julius A

適切なクラスまたはライブラリを使用する場合、彼らはあなたのためにエスケープを行います。多くのXMLの問題は、文字列の連結が原因です。

XMLエスケープ文字

わずか5つです。

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

エスケープ文字は、特殊文字が使用されている場所によって異なります。

サンプルは W3C Markup Validation Service で検証できます。

テキスト

安全な方法はテキストの5文字すべてをエスケープすることですが、3文字の"'、および>はテキストでエスケープする必要はありません。

<?xml version="1.0"?>
<valid>"'></valid>

属性

安全な方法は属性の5文字すべてをエスケープすることですが、>文字は属性でエスケープする必要はありません。

<?xml version="1.0"?>
<valid attribute=">"/>

引用符が'の場合、"文字を属性でエスケープする必要はありません。

<?xml version="1.0"?>
<valid attribute="'"/>

同様に、引用符が"の場合、'を属性でエスケープする必要はありません。

<?xml version="1.0"?>
<valid attribute='"'/>

コメント

5つのすべての特殊文字はコメントでエスケープしないでください

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

5つの特殊文字はすべて CDATA セクションでエスケープする必要があります

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

処理命令

5つの特殊文字はすべて、XML処理命令でエスケープしないでください

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XMLとHTML

HTMLには 独自のエスケープコードのセット があり、より多くの文字をカバーしています。

1283
Welbog

おそらくこれは役立ちます。

XMLおよびHTMLの文字実体参照のリスト

SGML、HTML、およびXML文書では、文字データおよび属性値と呼ばれる論理的な構成要素は文字のシーケンスで構成され、各文字は直接(それ自体を表す)表現することができます。そのうちの2つのタイプがあります:数値文字参照と文字実体参照。この記事では、HTMLおよびXML文書で有効な文字実体参照をリストします。

その記事には、次の5つの定義済みXMLエンティティがリストされています。

quot  "
amp   &
apos  '
lt    <
gt    >
89
Andrew Hare

World Wide Webコンソーシアム(w3C)の仕様によれば、 XML文書ではリテラル形式で表示されてはならない5文字があります 、マークアップ区切り文字として、またはコメント内で使用される場合を除き、処理命令、またはCDATAセクション。他のすべての場合では、これらの文字は、次の表に従って対応するエンティティまたは数値参照を使用して置き換える必要があります。

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

前述のエンティティは、XHTML 1.0で導入されHTML 4では宣言されていない - を除いて、HTMLでも使用できることに注意してください。このため、そして旧バージョンとの互換性を保つために、 XHTML仕様では代わりに ' の使用を推奨しています。

71
Albz

エスケープ文字はタグと属性で異なります。

タグの場合:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

属性の場合:

" &quot;
' &apos;

http://www.w3.org/TR/2008/REC-xml-20081126/#syntax

アンパサンド文字(&)および左角かっこ(<)は、マークアップ区切り文字として使用される場合、またはコメント、処理命令、またはCDATAセクション内で使用される場合を除き、リテラル形式で表示されてはなりません。他の場所で必要な場合は、それぞれ数字参照、または文字列 "&amp;"と "&lt;"を使用してエスケープする必要があります。直角括弧(>)は、文字列 "&gt;"を使用して表すことができます。互換性のために、文字列 "]]>"の内容が文字列[]]> "の場合その文字列がCDATAセクションの終わりを示していないとき。

属性値に一重引用符と二重引用符の両方を含めることができるようにするには、アポストロフィまたは一重引用符( ')を "&"、二重引用符( ")を"&quot; "と表します。 ".

47
Peter Bartels

一般的に知られている5つの文字[<、>、&、 "、 ']に加えて、垂直タブ文字(0x0B)もエスケープします。これは有効なUTF-8ですが、有効なXML 1.0ではなく、さらに多くのライブラリ( libxml2)それを見逃し、黙って無効なXMLを出力します。

20
Charon ME

古くてよく寄せられる質問に対する新しい簡単な回答...

単純化されたXMLエスケープ

  1. 常に (90%覚えることが重要)

    • <&lt; で始まっていない限り、<<tag/>としてエスケープします。
    • &&amp; で始まっていない限り、&&entity;としてエスケープします。
  2. 属性値 (9%覚えることが重要)

    • attr="'Single quotes'は二重引用符で囲まれていても問題ありません。"
    • attr='"二重引用符"は、一重引用符で囲んでも問題ありません。'
    • それ以外の場合は、"&quot;として、'&apos;としてエスケープします。
  3. コメント_ cdata _ 、および 処理命令 (0.9%覚えておくことが重要です)

    • <!--comments-->内ではエスケープする必要はありませんが、--文字列は使用できません。
    • <![CDATA[_ cdata _]]>内ではエスケープする必要はありませんが、]]>文字列は使用できません。
    • <?PITargetPIの中?>エスケープする必要はありませんが、?>文字列は使用できません。
  4. Esoterica (0.1%覚えておくことが重要です)

    • ]]>がCDATAセクションを終了していない限り、]]&gt;]]>としてエスケープします。
      (この規則は一般に文字データに適用されます - CDATAセクションの外でさえも)。
19
kjhughes

から要約: http://en.wikipedia.org/wiki/XML#Escaping

定義済みのエンティティは5つあります。

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

「許可されているすべてのUnicode文字は、数字参照で表すことができます。」次に例を示します。

&#20013;

制御文字やその他のUnicode範囲の大部分は特に除外されています。つまり、それらはエスケープされたものでも直接的なものでもあり得ません。

http://en.wikipedia.org/wiki/Valid_characters_in_XML

5
Tim Cooper

状況によって異なります。コンテンツの場合、<と&、および]]>です(ただし、1文字ではなく3の文字列です)。属性値の場合は、<と&および "and 'です。CDATAの場合は、]]>です。