2013-08-07 74 views
0

我有一个.xml文件,如下所示:故障解析XML数据

<entry> 
    <question>Which is larger? An elephant or a cat?</question> 
    <answer>Elephant</answer> 
</entry> 

我下面的教程,我试图从.xml文件中的数据解析成TextViews。但是,在下面的代码中,除去else if块(位于第二个while循环之下)将允许应用程序运行而不会失败,但会将结果留在应用程序中而不响应。我已经查看了代码,但我仍然无法找出错误的原因。

TextView tvQuestion = (TextView) findViewById(R.id.tvQuestion); 
    TextView tvAnswer = (TextView) findViewById(R.id.tvAnswer); 

    XmlResourceParser parser = getResources().getXml(R.xml.qa); 

    try 
    { 
     while(parser.next() != XmlPullParser.END_TAG) 
     { 
      if(parser.getEventType() != XmlPullParser.START_TAG) 
      { 
       continue; 
      } 

      String name = parser.getName(); 

      if(name.equals("entry")) 
      { 
       String question = ""; 
       String answer = ""; 

       while(parser.next() != XmlPullParser.END_TAG) 
       { 
        if(parser.getEventType() != XmlPullParser.START_TAG) 
        { 
         continue; 
        } 

        name = parser.getName(); 

        if(name.equals("question")) 
        { 
         question = readText(parser); 
         tvQuestion.setText(question); 
        } 
        else if(name.equals("answer")) 
        { 
         answer = readText(parser); 
         tvAnswer.setText(answer); 
        } 
       } 
      } 
     } 
    } 
    catch(XmlPullParserException e) 
    { 
     e.printStackTrace(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

private String readText(XmlPullParser parser) throws XmlPullParserException, IOException 
{ 
    String result = ""; 
    if(parser.next() == XmlPullParser.TEXT) 
    { 
     result = parser.getText(); 
     parser.nextTag(); 
    } 

    return result; 
} 
+0

发布错误日志以及。 –

+0

应用程序不响应,即当UI线程被阻塞5秒或更多时显示ANR。可能你的解析器代码有一个无限循环。在调试器中执行代码以了解您的解析器循环未终止的原因。 – laalto

+0

在遍历代码之后,我发现第一个while循环和下面的if语句之间存在无限循环。为了解决这个问题,我在while语句中添加了一个额外的条件:'while(parser.next()!= XmlPullParser.END_TAG && parser.getEventType()!= XmlPullParser.END_DOCUMENT)' – Jesse

回答

0

试试这个!

  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder; 
    try { 
     dBuilder = dbFactory.newDocumentBuilder(); 

     Document doc = dBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8")))); 
     doc.getDocumentElement().normalize(); 


     NodeList nList = doc.getElementsByTagName("entry"); 
     for (int temp = 0; temp < nList.getLength(); temp++) { 

      Element element = (Element) nList.item(temp); 

       NodeList q= element.getElementsByTagName("question"); 
       Element line = (Element) q.item(0); 

          String question = getCharacterDataFromElement(line); 
          tvQuestion.setText(question); 

       NodeList a = element.getElementsByTagName("answer"); 
       line = (Element) a.item(0); 

          String answer = getCharacterDataFromElement(line); 
          tvAnswer.setText(answer); 

     } 
       } catch (Exception e) { 

       } 

public static String getCharacterDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
     CharacterData cd = (CharacterData) child; 
     return cd.getData(); 
    } 
    return ""; 
}