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


925

XMLドキュメントでエスケープする必要のある文字は何ですか、またはそのようなリストはどこにありますか?


7
例:<company>AT&amp;T</company>
jacktrades

私が主要なソース(W3C Extensible Markup Language(XML)1.0(Fifth Edition))から抽出した簡潔で簡単に覚えられるガイドについては、以下の「簡略化されたXMLエスケープ」を参照してください。
kjhughes

回答:


1356

適切なクラスまたはライブラリを使用すると、エスケープが行われます。XMLの問題の多くは、文字列の連結が原因です。

XMLエスケープ文字

5つしかありません。

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

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

これらの例は、W3Cマークアップ検証サービスで検証できます

テキスト

安全な方法は、テキスト内の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

CDATAセクションでは、5つの特殊文字すべてをエスケープしてなりません

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

処理手順

5つの特殊文字すべて、XML処理命令でエスケープしてなりません

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

XMLとHTML

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


33
@Pacerier、独自のXML / HTMLエスケープコードを記述しないでください。ライブラリ関数を使用しないと、特別なケースを見逃すことになります。
Jason

5
また、改行には&#xA;を使用する必要があります。&#xD; と&#x9; タブで、属性にこれらの文字が必要な場合。
radistao 2012年

78
これらに対して検索/置換を行う場合は、&amp; 他の前に交換。
Doug

2
@Doug私はまったく同じことを述べようとしていました-さもなければ、他のすべての置き換えられた文字が破損し、次のようなもの&quot;が変更されます&amp;quot;
Jerry Dodge

5
ウィキペディアから:「許可されているすべてのUnicode文字は、数字参照で表すことができます。」だから、より多く5以下がある
ティム・クーパー

93

おそらくこれは役立つでしょう:

XMLおよびHTML文字エンティティ参照のリスト

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

この記事では、次の5つの定義済みXMLエンティティを示しています。

quot  "
amp   &
apos  '
lt    <
gt    >

73

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

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

前述のエンティティはHTMLでも使用できることに注意してください、XHTML 1.0で導入されたもので、HTML 4では宣言されていません。このため、レトロコンパチビリティを確保するために、XHTML仕様では&#39;の使用を推奨しています。代わりに。


14
XMLはこれら5つのエンティティを事前定義しますが、これらの5つの文字をリテラル形式で使用できないことを絶対に指定するものではありません。<および&はどこでもエスケープする必要があります(CDATAを除く)。"と"属性値のみでエスケープする必要があり、対応する引用符文字が同じである場合にのみ、そして、>実際にエスケープする必要がありません。。
ショーンMcCance

3
上記のように、<> "& 'は、マークアップ区切り文字として使用する場合、またはコメント、処理命令、またはCDATAセクション内で使用する場合はエスケープする必要はありません。つまり、<>をXMLタグとして使用する場合はエスケープしません。コメントについても同じです(XMLファイルのコメント行で&をエスケープしますか?エスケープする必要はありません。そうしなくてもXMLは引き続き有効です)。これは、 W3CによるXML
Albz

7
@ShaunMcCance は、CDATAセクションの終わりを示す区切り文字の一部となることを意図していない限り、コンテンツ内>で続く場合はエスケープする必要があります。]]]]>
Lee D

2
ネクロマンサーではありませんが、@ Albzは、これらの文字がコンテンツ内でエンティティ化されている必要があると言っているのは誤りです。w3.org/TR/REC-xml/#NT-CharDataのセクション2.4を参照してください。そのTL; DRバージョンは、chardata要素のコンテンツと&amp; と&lt; 常に有能である必要があります。&gt; 文字はエンティティ化される場合がありますが、リテラル文字列「]]>」内に出現する場合は必須です。それ以外の場合は、CDATAセクションの終了として読み取られます。一重引用符と二重引用符の場合、必要に応じてエスケープできます。要素内のchardataについては以上です。XMLの他のコンポーネントには他のルールがあります。
スカイ---キャプテン2016

52

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

タグの場合:

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

属性の場合:

" &quot;
' &apos;

文字データとマークアップ

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

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


これは、属性のためにのみ引用符をエスケープする必要があるが、それは他の3つの文字に加えて、あることを意味する
EUG

40

古い、よくある質問に対する新しい簡単な回答...

簡略化されたXMLエスケープ(優先、100%完了)

  1. 常に (覚えておくことが90%重要)

    • がを開始して<&lt;ないかのようにエスケープします。<<tag/>
    • がを開始&&amp;ない限りエスケープします。&&entity;
  2. 属性値 (9%覚えておくことが重要)

    • attr=" '単一引用符'は二重引用符内で問題ありません。"
    • attr=' "二重引用符"は、単一引用符内で問題ありません。'
    • エスケープ"&quot;して'&apos;そうでありません。
  3. コメントCDATA、および処理命令 (0.9%が重要)

    • <!--コメント 内で-->何もエスケープする必要はありませんが、--文字列は許可されません。
    • <![CDATA[CDATA]]>ではエスケープする必要はありませんが、]]>文字列は許可されません。
    • <?PITargetPI?>ではエスケープする必要はありませんが、?>文字列は許可されません。
  4. Esoterica (0.1%覚えておくことが重要)

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

注意すべきもう1つのルール:CDATAセクションにない場合でも、]]>としてエスケープする必要があります]]&gt;。それを達成する最も簡単な方法は、常に>として脱出することかもしれません&gt;
マイケルケイ

ありがとう、@ MichaelKay。私はあなたの役に立つメモを組み込みました]]> が、> 常にエスケープすることを提案するのではなく、エスソテリカに委任することを選択しました(ご存知のように、エスケープする必要はありません)。ここでの私の目標は、XMLエスケープルールを簡単に覚えられ 100%正確にすることです。
kjhughes

受け入れられたものを含む上記の回答は、5つの文字すべてが属性内でエスケープされるべきだと述べています。あなたの答えは論理的に正しいように思われるので、あなたが言っていることを裏付けるXML標準への参照はありますか?
ローマンスージー

1
@RomanSusi:はい、他の多くの回答には、公式XML BNFの聞き取り、誤解、または誤解に基づいたエラーまたは一般化(「安全な方法...」)が含まれています。私の答えは(a)W3C XML勧告によって100%正当化されています。公式のBNFへの多くのリンクされた参照を参照してください。(b)簡潔で論理的で、簡単に覚えられるこれらの要件の進行に編成されています。
kjhughes

@RomanSusi:「5つの文字はすべて属性内でエスケープする必要がある」という具体的な説明はAttValue2。 属性値のリンクを介した私の回答で引用されている公式のBNFルールではサポートされていないずさんなガイダンスです。
kjhughes

25

よく知られている5文字[<、>、&、 "、および ']に加えて、垂直タブ文字(0x0B)もエスケープします。これは有効なUTF-8ですが、有効なXML 1.0ではなく、多くのライブラリでも(非常に移植性の高い(ANSI C)ライブラリlibxml2を含む)それを見逃して、無効なXMLを警告なしに出力します。


11

要約:XML、エスケープ

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

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

「許可されているすべてのUnicode文字は、数字参照で表すことができます。」例えば:

&#20013;

ほとんどの制御文字と他のUnicodeの範囲は明確に除外されています。つまり、エスケープまたは直接のどちらでも発生することはありません(と思います)。

XMLの有効な文字


3

状況によります。内容は< and 、and ]]>です(ただし、1文字ではなく3文字のストリングです)。

属性値の場合は、<"、および'です。

CDATAの場合は]]>です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.