Oracle から XML に文字をエンコードするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/156697

  •  03-07-2019
  •  | 
  •  

質問

私の環境では、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&#26;</column>
    <column num="3">FCVolume                      </column>
</row>

しかし、XML を解析すると、

org.xml.sax.SAXParseException:登場人物紹介 "&#26は 無効な 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 以降を使用できるようにするにはどうすればよいですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top