2012-09-18 69 views
0

我有一个XML文件,其中包含一些从URL中检索到的阿拉伯字符,所以我必须使用UTF-8对其进行编码,以便它可以处理这些字符。解析UTF-8编码的XML文件

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; 
} 

现在返回的字符串传递给此方法来获取供日后使用的文件如下图所示:

此消息ocured错误:

09-18 07:51:40.441: E/Error:(1210): Unexpected token (position:TEXT @1:4 in [email protected]) 

因此,代码崩溃,我有以下错误

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编码。

+1

Upvoted仅仅因为有两个没有评论的评论(没有任何明显的理由,这个问题是合理的)。 – bortzmeyer

+0

我也这么做了。 – Neta

回答

2

您已在您的UTF-8文件中添加了BOM。哪个不好。

也许你用记事本编辑了你的文件,或者你应该检查你的编辑器以确保它不会添加BOM。

由于BOM似乎在文本内部而不是在开始时,您还需要通过在其位置周围使用删除键(它在大多数编辑器中不可见)将其删除。这可能发生在文件连接操作过程中。

+1

很抱歉,为什么BOM不好?检测UTF-8编码是否有用? – RvdK

+0

它被创建用来检测其他Unicode格式的字节顺序,但是被微软扩展为UTF-8,它没有任何意义。例如,当你连接文件时,它会产生奇怪的错误。 –

+0

那么你建议我做什么@dystroy –

1

这可能不是问题,但EntityUtils.toString(httpEntity).getBytes()正在使用默认平台编码。您应该使用EntityUtils.toString(httpEntity)作为String,不需要将其转换为字节。

此外,请阅读此http://kunststube.net/encoding/了解发生了什么事情的有用背景。

+0

Thanx的帮助,但它不是这里的问题 –

+0

@Karim'new String(EntityUtils.toString(httpEntity).getBytes(),“UTF-8”);如果您的平台编码不是UTF-8 – artbristol

+0

,那么将会混淆您的字符,这些字符很奇怪,而不是XML中的阿拉伯字符! –