2012-01-11 16 views
5

私はXMLインターネットを読み込むAndroidアプリケーションを作っています。このアプリケーションは、SAXを使用してXMLを解析します。これは、構文解析の一部のために私のコードです:

public LectorSAX(String url){ 
    try{ 
     SAXParserFactory spf=SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     DefaultHandler lxmlr=new LibraryXMLReader() ; 
     sp.parse(url, lxmlr); 

     nodo=((LibraryXMLReader)lxmlr).getNodoActual(); 

    }catch(ParserConfigurationException e){ 
     System.err.println("Error de parseo en LectorSAX.java: "+e); 
    }catch(SAXException e){ 
     System.err.println("Error de sax LectorSAX.java: " + e); 
    } catch (IOException e){ 
     System.err.println("Error de io LectorSAX.java: " + e); 
    } 
} 

問題は、SAXExceptionのが発生するということです。次のように例外メッセージは、次のとおりです。

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

私は通常のJava SEアプリケーションで同じコードを置く場合は、この例外が発生しないとすべてが正常に動作します。

Java SEアプリケーションで同じコードが正常に動作するのはなぜですか?Androidではできません。一方、どのように問題を解決するには?

ありがとうございます。

ご挨拶。

+0

ur xml ...を共有できますが、エラーごとにur xmlに問題があります。 –

+0

@MohitSharmaしかし、AndroidコードではなくJava SEアプリケーションで同じコードが正常に動作するのはなぜですか?これはURLです:http://www.aemet.es/xml/municipios/localidad_33002.xml – Lobo

+0

original私はur xmlにはエラーごとにいくつかの問題があると思っていましたが、そのようには...今や唯一の解決策あなたはUとのデバッグを解析している –

答えて

11

これは文字エンコードの問題です。
ご覧のとおり、無効なトークンエラーは#4行目を指しています。
この列には、急な(Meteorología)とチルダ(España)があります。 XMLヘッダーには、ISO-8859-15エンコード値が表示されます。 UTFやISO-8859-1のエンコーディングよりも一般的ではないため、SAXParserが接続し、システムのデフォルトのcharsetを使用してバイトコンテンツをcharに変換しようとすると、エラーが発生する可能性があります。

次に、使用する文字セットをSAXParserに伝える必要があります。これを行う方法は、URLの代わりにInputSourceをparseメソッドに渡すことです。例として:

SAXParserFactory factory = SAXParserFactory.newInstance(); 
SAXParser parser = factory.newSAXParser(); 

InputSource is = new InputSource(url); 
is.setEncoding("ISO-8859-15"); 

DefaultHandler lxmlr=new LibraryXMLReader() ; 
sp.parse(is, lxmlr); 

EDIT: Android VMはorg.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unknown encoding例外をスロー、このエンコーディングをサポートしていないようです。
ISO-8859-15のように、いくつかの特定の文字(hereが表示されます)を除いて、ISO-8859-1と互換性があります。回避策は、setEncodingメソッドでの値をISO-8859-1に変更して、異なるが互換性のある文字セットエンコーディング:

is.setEncoding("ISO-8859-1"); 

それはそうとAndroidが宣言した文字セットをサポートしていないとして、それがデフォルト(UTF-8)を使用していますので、パーサが選択するXML宣言を使用することはできません栄養価の高いエンコード。

+1

こんにちは@ tomas-narros、ありがとう、私はしようとすると、結果に気づくでしょう。 – Lobo

+3

パーサーは適切にXML宣言を使用して適切なエンコーディングを選択してはいけませんか? –

+1

それは良い点@JBです。確かにそれはすべきです。しかし、私はこれがエンコーディングの問題だと確信しています。 –