2011-06-27 19 views
2

私の質問はWhy are "control" characters illegal in XML 1.0?と似ていますが、XML仕様ではXMLの制御文字が許可されているのではなく、以下の問題の解決策を探しています。Servletからの文字列でXMLの制御文字CDATA

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

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

Error: not well-formed 
Location: 

<![CDATA[ 

私はそれを「XMLの安全」にするためにJavaのStringを処理できる方法はありますか?特に、CDATAセクションに置くと安全ですか?

私の質問がはっきりしていることを願います!事前に

おかげで、 ラジ

答えて

2

このXML-安全を作るための唯一の準拠の方法は、独自のエンコーディングを追加することです。テキストデータとして

  • ストアすべてのデータといくつかのUnicodeエスケープ機構をすべて禁止さの文字を置き換える:あなたは(例えば)これら二つのいずれかを行うことができ

    (XML自体に定義されたもの以外の!) 。たとえば、Javaで使用されているものを使用することができます。\u0001はU + 0001です。 または

  • データをバイナリデータとして格納し、base64BinaryhexBinaryとしてXMLにデータを格納します。これらのアプローチの両方

は、消費者プロデューサの両方で明示的なサポートを必要とします。 2番目のアプローチでは、広くサポートされている明確なデータ型を使用する利点がありますが、コンテンツが実際にテキストの場合は、 )。

もしすべてnon-transferable charactersは、この正規表現は、トリックを行う必要があり、適切であろう取り除く:

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(""); 

注スペックは、その文書の作成者が、より限定的に使用できる文字のセットを持つこと示唆していることをノート。その正規表現は少し長くなります。

+0

早急に対応してくれてありがとうSauer。私は、Stringを受け取り、XMLで安全でない文字を含む文字列を返す第三者APIが存在することを願っていました。一口! – ragebiswas

+0

@Raj:違反する文字を削除するだけで問題ありませんか?それははるかに簡単かもしれません... –

+0

サウアー、そう、それは私のために良いだろう。しかし、私は空白や改行などの制御文字を削除したくありません。 – ragebiswas

関連する問題