2013-12-18 70 views
0

我试图解析包含1电视节目中所有剧集的XML文件。每当我试图把结果从XML文件通过domparser 到一个列表我得到一个错误。我想这是因为它工作异步,但我怎么能解决这个问题,或者我做错了什么?从解析的XML文件创建表时出现Android错误

后来我想把这个列表的数据放到数据库中,你可以看到,我现在留下了它的注释。

代码我的的onCreate,我调用该方法readEpisodeListXmlFromSerieId(长ID)来解析XML文件:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    db = new DatabaseHelper(this); 
    shows = db.getAllMyFollowingShows(); 

    if (shows.size() != 0) { 
     for (Show show : shows) { 
      if (db.getAllEpisodesFromShow(show.getId()).size() == 0) { 
       readEpisodeListXmlFromSerieId(show.getId()); 
      } 
     } 
    } 
} 

这里是我的代码解析XML文件,并尝试将数据放入名单:

private void readEpisodeListXmlFromSerieId(Long id) { 
    HttpReader httpReader = new HttpReader(); 

    httpReader.setOnResultReadyListener(new HttpReader.OnResultReadyListener() { 
       @Override 
       public void resultReady(String result) { 
        domParser.buildDomDocument(result); 

              // This gives the error 
        episodesFromShow = domParser.getAllEpisodesByShow(); 

//      for (Episode episode : episodesFromShow) { 
//       try { 
//        db.createEpisode(episode); 
//       } catch (Exception e) { 
//        // TODO: handle exception 
//       } 
//      } 
       } 

      }); 
    httpReader.execute("http://thetvdb.com/data/series/" + id + "/all/"); 
} 

这是的DOMParser功能被称为填充列表:

public List<Episode> getAllEpisodesByShow() { 
    List<Episode> list = new ArrayList<Episode>(); 
    NodeList episodes = doc.getDocumentElement().getElementsByTagName(
      "Episode"); 

    for (int i = 0; i < episodes.getLength(); i++) { 
     String aired = episodes.item(i).getChildNodes().item(11) 
       .getTextContent(); 

     if (!aired.equals("")) { 
      list.add(new Episode(Long.parseLong(episodes.item(i) 
        .getChildNodes().item(0).getTextContent()), Integer 
        .parseInt(episodes.item(i).getChildNodes().item(10) 
          .getTextContent()), episodes.item(i) 
        .getChildNodes().item(9).getTextContent(), episodes 
        .item(i).getChildNodes().item(15).getTextContent(), 
        Integer.parseInt(episodes.item(i).getChildNodes() 
          .item(19).getTextContent()), Integer 
          .parseInt(episodes.item(i).getChildNodes() 
            .item(28).getTextContent()), aired, 0)); 

     } 
    } 
    return list; 
} 

这里是logcat的错误:

FATAL EXCEPTION: main 
java.lang.NumberFormatException: Invalid int: "" 
java.lang.Integer.invalidInt(Integer.java:138) 
java.lang.Integer.parseInt(Integer.java:359) 
java.lang.Integer.parseInt(Integer.java:332) 
com.example.myshows.DomParser.getAllEpisodesByShow(DomParser.java:107) 
com.example.myshows.MyShows$1.resultReady(MyShows.java:50) 
com.example.myshows.HttpReader.onPostExecute(HttpReader.java:40) 
com.example.myshows.HttpReader.onPostExecute(HttpReader.java:1) 
android.os.AsyncTask.finish(AsyncTask.java:602) 
android.os.AsyncTask.access$600(AsyncTask.java:156) 
android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
android.os.Handler.dispatchMessage(Handler.java:99) 
android.os.Looper.loop(Looper.java:137) 
android.app.ActivityThread.main(ActivityThread.java:4524) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:511) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
dalvik.system.NativeStart.main(Native Method) 

回答

1

发生错误您在这里:

if (!aired.equals("")) { 
     list.add(new Episode(Long.parseLong(episodes.item(i) 
       .getChildNodes().item(0).getTextContent()), Integer 
       .parseInt(episodes.item(i).getChildNodes().item(10) 
         .getTextContent()), episodes.item(i) 
       .getChildNodes().item(9).getTextContent(), episodes 
       .item(i).getChildNodes().item(15).getTextContent(), 
       Integer.parseInt(episodes.item(i).getChildNodes() 
         .item(19).getTextContent()), Integer 
         .parseInt(episodes.item(i).getChildNodes() 
           .item(28).getTextContent()), aired, 0)); 

    } 

具体位置:

Integer.parseInt(episodes.item(i).getChildNodes().item(10).getTextContent()) 

而且

Integer.parseInt(episodes.item(i).getChildNodes().item(19).getTextContent()) 

你做两次(另一个整数和长)。您正尝试将空字符串(“”)解析为Integer。你解析之前,您应该添加一个检查:

if (!aired.equals("") && 
     !episodes.item(i).getChildNodes().item(10).getTextContent().equals("") && 
     !episodes.item(i).getChildNodes().item(19).getTextContent().equals("")) { 
     //code 
    } 

您可能需要定制该检查一些更根据您的目标是什么。如果它是空的,那么不要继续这个过程。您可以抛出错误,写入错误信息或继续。

注意:你应该对空字符串和空指针做更多的检查以防万一。

1

它看起来像你的代码试图解析一个空字符串为整数。检查你的输入空串。

此外,这很可能会导致“应用程序未响应”错误,因为您正在主线程上运行解析作业。请参阅Best Practices for Background Jobs了解如何将其推到自己的线程上。