1

次のように DocumentBuilderFactory を使用して XML ファイルを解析しようとしています。

DocumentBuilderFactory ndsParserFactory = DocumentBuilderFactory.newInstance( );
ndsParserFactory.setNamespaceAware( true );
DocumentBuilder ndsParser = ndsParserFactory.newDocumentBuilder( );
Document ndsDocument = ndsParser.parse( ndsFileInputStream );

ここで、ndsFileInputStream は、XML を含むファイルをラップする InputStream です。

ファイルに Δ などの Unicode 文字が含まれていると、例外が発生します。問題のある文字を含む行を取り除くと、解析はうまくいきます。

このファイルには、特性<?xml version="1.0" encoding="utf-8"?>ヘッダーが含まれています。

△ 文字を処理するために DocumentBuilderFactory (または DocumentBuilder) インスタンスを適切に構成することを怠っているのではないかと思っています。

編集(コメントから):

完全な開示: これは Android であり、XML ファイル (ファイル拡張子は NDS) を Android アプリのアセットとして含めています。AssetManager を介してアクセスします。AssetManager には、アセット ファイルを InputStream で開くための便利なメソッドがあり、DocumentBuilder の parse メソッドに渡します。– d 溶接 16 時間前

アセット フォルダーのコンテンツには、デフォルトで CP1252 のエンコーディングが使用されていることに気付きました。ということでUTF8に変更。運がない。次に、NDS ファイルの 1 つ (リンクごと) から BOM を削除し、再試行しました。運がない。APK ファイル (ZIP ファイルのように圧縮されている) が何らかの形で非 ASCII XML をマングリングしていると考えています。他の方法でNDSファイルをAndroidデバイスに取得する必要があると思います...

4

1 に答える 1

-1

ファイルが本当に UTF-8 で書かれていると確信していますか? 明らかに、一部のエディターで開くことができ、テキストが正しく表示されますが、エンコーディングとして適切に推測されている可能性があります。

覚えておくべきもう 1 つのことは、すべての文字が UTF-8 の Unicode であることです。パーサーは、宣言されたエンコーディングで有効でないバイト シーケンスにヒットすると、単に窒息します。UTF-8 は、7 ビット ASCII セット内のすべての文字がプレーン ASCII であるかのようにエンコードされ、多くの XML がプレーン ASCII 文字だけで構成されているため、使用するのに非常に寛容なエンコーディングです。これは、ASCII 以外の何かが出現し、システムを介したテキスト エンコーディング パスの欠陥が突然明らかになったときに人々を捕らえます。

XML 宣言を編集して、別の文字エンコーディングで問題なく解析されるかどうかを確認できます。8859-7には Δ 記号が含まれています - その中でエンコードできますか?

また、例外は何ですか?

于 2012-05-21T21:27:37.270 に答える