Oracle から XML に文字をエンコードするにはどうすればよいですか?
質問
私の環境では、Java を使用して結果セットを XML にシリアル化しています。それは基本的に次のように起こります。
//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");
XML は Firefox では次のようになります。
<row num="69004">
<column num="1">10069</column>
<column num="2">sd</column>
<column num="3">FCVolume </column>
</row>
しかし、XML を解析すると、
org.xml.sax.SAXParseException:登場人物紹介 "は 無効な XML 文字。
今の私の質問は次のとおりです。有効な XML にするためには、どの文字を置き換える必要がありますか、または文字をどのようにエンコードする必要がありますか?
解決
で興味深いリストを見つけました XML仕様:そのリストによると、文字 #26 (16 進数: #x1A).
で定義された文字が使用されます。 以下の範囲も推奨されない。コントロール・キャラクターか 永久に未定義のユニコード 文字
を参照してください。 完全な範囲.
このコードは、文字列からの無効な Xml Utf8 をすべて置き換えます。
public String stripNonValidXMLCharacters(String in) {
StringBuffer out = new StringBuffer(); // Used to hold the output.
char current; // Used to reference the current character.
if (in == null || ("".equals(in))) return ""; // vacancy test.
for (int i = 0; i < in.length(); i++) {
current = in.charAt(i);
if ((current == 0x9) ||
(current == 0xA) ||
(current == 0xD) ||
((current >= 0x20) && (current <= 0xD7FF)) ||
((current >= 0xE000) && (current <= 0xFFFD)) ||
((current >= 0x10000) && (current <= 0x10FFFF)))
out.append(current);
}
return out.toString();
}
から取られたものです 無効な XML 文字:有効な UTF8 が有効な XML を意味しない場合
しかし、それでもまだ UTF-8 互換性の問題がありました。
org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence
読んだあと XML - サーブレットから XML を UTF-8 として返す Contenttype を次のように設定するとどうなるかを試してみました。
response.setContentType("text/xml;charset=utf-8");
そしてそれはうまくいきました...。
他のヒント
拡張マークアップ言語 (XML) 1.0 言います:
アンパサンド文字 (&) と 左の角括弧(<)は使用してはならない。 ただし マークアップの区切り文字として、あるいは コメント、処理命令、または CDATAセクション。必要な場合 を使用してエスケープする必要があります。 数値文字参照または 文字列 "&" と "<" それぞれだ。直角ブラケット (>) は 文字列">"でなければならない。 互換性を保つには、次のいずれかを使用してエスケープする。 「または文字参照 の文字列"]]>"に表示される。 その文字列が CDATAセクションの終わりを示す。
CDATA を使用する場合は、エンコードをスキップできます。
<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>
JRE のどのバージョンを実行していますか? サックスプロジェクト 言います:
J2SE 1.4では、古いバージョンの SAX2。SAX2 r2 以降を使用できるようにするにはどうすればよいですか?