私は次のような文字列を保持する XML を扱っています:
<node>This is a string</node>
ノードに渡す文字列の中には、、、&
などの#
文字が含まれるものがあります。$
<node>This is a string & so is this</node>
これは のため無効です&
。
これらの文字列は、そのままでは必要なので、CDATA でラップできません。CDATA なしでは XML ノードに配置できない文字のリストを探してみました。
誰か私にその方向を教えてくれたり、違法な文字のリストを提供してくれませんか?
ベストアンサー1
さて、次の文字の質問を分離してみましょう。
- どの XML ドキュメントでもまったく有効ではありません。
- 脱出する必要がある。
「https://stackoverflow.com/questions/730133/invalid-characters-in-xml/5110103#5110103」で @dolmen が提供した回答はまだ有効ですが、XML 1.1 仕様に合わせて更新する必要があります。
1. 無効な文字
ここで説明する文字は、XML ドキュメントに挿入できるすべての文字です。
1.1. XML 1.0の場合
- 参照: 参照XML勧告1.0、§2.2 文字
許可される文字のグローバル リストは次のとおりです。
[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
基本的に、制御文字と Unicode 範囲外の文字は許可されません。つまり、たとえば文字エンティティの呼び出しも
禁止されます。
1.2. XML 1.1の場合
- 参照: 参照XML勧告1.1、§2.2 文字、 そして1.3 XML 1.1 の根拠と変更点の一覧
許可される文字のグローバル リストは次のとおりです。
[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
この XML 勧告の改訂版では、許可される文字が拡張され、制御文字が許可されるようになり、Unicode 標準の新しい改訂版が考慮されていますが、NUL (x00)、xFFFE、xFFFFなどの文字は依然として許可されていません。
ただし、制御文字や未定義の Unicode 文字の使用は推奨されません。
また、すべてのパーサーが常にこれを考慮するわけではなく、制御文字を含む XML ドキュメントが拒否される可能性があることにも注意してください。
2. エスケープする必要のある文字(整形式のドキュメントを取得するため):
これはタグの始まりとみなされるため、エンティティを<
使用してエスケープする必要があります。<
はエンティティ参照の始まりとみなされるため、エンティティ&
でエスケープする必要があります。&
はエンティティ>
でエスケープする必要があります>
。必須ではありません (コンテキストによって異なります) が、エスケープすることを強くお勧めします。
はエンティティ'
でエスケープする必要があります'
。単一引用符で定義された属性では必須ですが、常にエスケープすることを強くお勧めします。
"
エンティティを使用してエスケープする必要があります。二"
重引用符で囲まれた属性では必須ですが、常にエスケープすることを強くお勧めします。