2

私の質問は、XML 1.0で「制御」文字が不正なのはなぜですか?に似ています。-ただし、XML仕様でXMLの制御文字が許可されていない理由ではなく、以下の問題の解決策を探しています。

ユーザーの要求に応じてXMLを含む文字列を出力するサーブレットがあります。1つの特定の要素には、ユーザー入力テキストを含めるために必要なCDATAセクションが含まれています。

ある特定のケースでは、ユーザー入力に文字U + 0001(制御文字)が含まれていることがあります。また、文字セットをUTF-8として指定しても、サーブレットはエラーをスローします。

Error: not well-formed
Location: 

<![CDATA[ 

Java文字列を処理して「XMLセーフ」にする方法はありますか?特に、CDATAセクションに配置するときに安全にするために?

私の質問が明確であることを願っています!

よろしくお願いします、Raj

4

1 に答える 1

2

このXMLを安全にする唯一の適合方法は、独自のエンコーディングを追加することです。

次の2つのうちの1つを実行できます(たとえば)。

  • すべてのデータをテキストデータとして保存し、すべての禁止文字を何らかのUnicodeエスケープメカニズム(XML自体で定義されているものを除く)に置き換えます。たとえば、Javaで使用されているもの\u0001(U + 0001用)を使用できます。また
  • データをバイナリデータとして保存し、hexBinaryのbase64Binaryを使用してデータをXMLに保存します。

これらのアプローチは両方とも、消費者生産者の両方で明示的なサポートが必要です。2番目のアプローチには、幅広いサポートを備えた明確に定義されたデータ型を使用するという利点がありますが、コンテンツが実際にテキストである場合は、バイトストリームで使用されるエンコーディングを指定(または通信)する必要があります(XML自体によって否定される必要があります) )。

転送できない文字をすべて削除することが適切な場合は、この正規表現でうまくいくはずです。

Pattern XML_INVALID_CHARS = Pattern.compile("[^\u0009\n\r\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF ]+");
String xmlSafe = XML_INVALID_CHARS.matcher(input).replaceAll("");

仕様では、ドキュメントの作成者は、メモで許可されている文字のセットをさらに制限することを提案していることに注意してください。その正規表現は少し長くなります。

于 2011-06-27T08:06:27.597 に答える