8

私の環境では、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: 文字参照 "  " は無効な XML 文字です。

私の質問は次のとおりです。どの文字を置き換える必要がありますか、またはどのように文字をエンコードする必要がありますか?それらは有効な XML になりますか?

4

3 に答える 3

7

Xml Specで興味深いリストを見つけました: そのリストによると、Character #26 (Hex: #x1A ) の使用は推奨されていません。

次の範囲で定義されている文字も推奨されません。それらは、制御文字または永久に未定義の Unicode 文字のいずれかです

完全な範囲を参照してください。

このコードは、有効でないすべての 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();
}    

Invalid XML Characters: 有効な 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");

そしてそれは働いた....

于 2008-10-01T08:46:37.893 に答える
2

Extensible Markup Language (XML) 1.0には次のように書かれています。

アンパサンド文字 (&) と左山かっこ (<) は、マークアップ区切り文字として使用する場合、またはコメント、処理命令、または CDATA セクション内で使用する場合を除き、リテラル形式で使用してはなりません。他の場所で必要な場合は、数字参照または文字列「&」と「<」をそれぞれ使用してエスケープする必要があります。右山かっこ (>) は、文字列 ">" を使用して表すことができ、互換性のために、コンテンツ内の文字列 "]]>" に表示される場合は、">" または文字参照を使用してエスケープする必要があります。 string が CDATA セクションの終わりを示していません。

CDATA を使用する場合は、エンコードをスキップできます。

<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>
于 2008-10-01T08:46:10.813 に答える
0

どのバージョンの JRE を実行していますか? サックス・プロジェクトは次のように述べています。

J2SE 1.4 には、古いバージョンの SAX2 がバンドルされています。SAX2 r2 以降を使用可能にするにはどうすればよいですか?

于 2008-10-01T09:13:43.633 に答える