0

URLから取得したアラビア文字を含むXMLファイルがあるので、そのような文字を処理できるようにUTF-8でエンコードする必要がありました。

XMLファイル:

<Entry>

    <lstItems>            
           <item>
        <id>1</id>
            <title>News Test 1</title>
            <subtitle>16/7/2012</subtitle>
        <img>joelle.mobi-mind.com/imgs/news1.jpg</img>
           </item>
           <item>
        <id>2</id>
            <title>كريم</title>
            <subtitle>16/7/2012</subtitle>
        <img>joelle.mobi-mind.com/imgs/news2.jpg</img>
           </item>
           <item>
        <id>3</id>
            <title>News Test 333</title>
            <subtitle>16/7/2012</subtitle>
        <img>joelle.mobi-mind.com/imgs/news3.jpg</img>
           </item> 
           <item>
        <id>4</id>
            <title>ربيع</title>
            <subtitle>16/7/2012</subtitle>
        <img>joelle.mobi-mind.com/imgs/cont20.jpg</img>
           </item> 
           <item>
        <id>5</id>
            <title>News Test 55555</title>
            <subtitle>16/7/2012</subtitle>
        <img>joelle.mobi-mind.com/imgs/cont21.jpg</img>
           </item>      
           <item>
        <id>6</id>
            <title>News Test 666666</title>
            <subtitle>16/7/2012</subtitle>
        <img>joelle.mobi-mind.com/imgs/cont22.jpg</img>
           </item>               
    </lstItems>
  </Entry>

以下に示すように、URLから取得したXMLを文字列として解析しました。

public String getXmlFromUrl(String url) {

    try {
        return new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                //String xml = null;
                try {
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpGet httpPost = new HttpGet(params[0]);
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    xml = new String(EntityUtils.toString(httpEntity).getBytes(),"UTF-8");


                } catch (Exception e) {
                    e.printStackTrace();
                }
                return xml;




            }
        }.execute(url).get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return xml;
}

次に、返された文字列がこのメソッドに渡され、次に示すように後で使用するドキュメントを取得します。

public Document getDomElement(String xml){

        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        try {

            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource();
            StringReader xmlstring=new StringReader(xml);
            is.setCharacterStream(xmlstring);
            is.setEncoding("UTF-8");
                    //Code Stops here !
            doc = db.parse(is); 


        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }
        // return DOM
        return doc;

}

このメッセージでエラーが発生しました:

09-18 07:51:40.441: E/Error:(1210): Unexpected token (position:TEXT @1:4 in java.io.StringReader@4144c240) 

そのため、上記の場所でコードがクラッシュし、次のエラーが発生します

09-18 07:51:40.451: E/AndroidRuntime(1210): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.university1/com.example.university1.MainActivity}: java.lang.NullPointerException

コードはISOエンコーディングで正常に機能することに注意してください。

4

2 に答える 2

2

UTF-8 ファイルにBOMを追加しました。これは悪いことです。

ファイルをメモ帳で編集したか、エディタをチェックして BOM が追加されていないことを確認する必要があります。

BOM はテキスト内にあり、先頭にないように見えるため、その位置で削除キーを使用して BOM を削除する必要もあります (ほとんどのエディターでは表示されません)。これは、ファイルの連結操作中に発生した可能性があります。

于 2012-09-18T08:21:38.230 に答える
1

これは問題ではないかもしれませんがEntityUtils.toString(httpEntity).getBytes()、デフォルトのプラットフォーム エンコーディングを使用しています。EntityUtils.toString(httpEntity)として使用するString必要があります。バイトに変換する必要はありません。

また、このhttp://kunststube.net/encoding/を読んで、何が起こっているかについての有用な背景を確認してください。

于 2012-09-18T08:24:35.290 に答える