1

で始まる XML ファイルがあります<?xml version="1.0" encoding="iso-8859-2"?>。私は次のように読みました。

SAXParserFactory.newInstance().newSAXParser().parse(is, handler);

ここisで、 は InputStream でhandlerあり、任意のハンドラです。次に、この例外が発生します。

org.apache.harmony.xml.ExpatParser$ParseException: At line 41152, column 17: not well-formed (invalid token)

実際には、この位置に度記号があり、次のように CDATA で囲まれています。

<![CDATA[something °]]>

文字セット iso-8859-2 を使用すると、パーサーはこの文字を含むほぼすべての文字を受け入れる必要があります。そうではないようです。私は何を間違っていますか?

編集

私はこれをすべてAndroidで行っています。

奇妙なことに、パーサーはエンコーディング属性を完全に無視しているようです。ヘッダーをそのまま残してファイルを UTF-8 に変換したところ、プログラムでエラーなく読み取れるようになりました。何故ですか??

(私はこのように InputStream を作成しています: new BufferedInputStream(new FileInputStream(filename))、つまりリーダーがないため、エラーになることはありません。)

4

1 に答える 1

0

エンコーディングを手動で認識することで、エラーを回避しました。私は XML ヘッダーを覗き、encoding属性 (利用可能な場合) を探し、文字列として抽出し、それCharsetから Java オブジェクトを作成し、指定さCharset.forName()れたエンコーディングで Reader を作成し、その Reader に対して InputSource を次のように作成しました。

String encoding;
Charset charset;
[...]
    Reader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
    InputSource inputSource = new InputSource(reader);
    inputSource.setEncoding(encoding);
    SAXParserFactory.newInstance().newSAXParser().parse(inputSource, myHandler);

残念ながら、エンコーディングがパーサーによって自動的に認識されなかった理由はまだわかりません。

于 2013-03-27T10:39:15.677 に答える