2013-10-21 107 views
0

我嘗試用XmlPullParser解析簡單的xml文件。爲什麼會發生XmlPullParserException異常?

<?xml version="1.0" encoding="utf-8"?> 

<tests> 
    <test> 
     <name>Jack</name> 
    </test> 
    <test> 
     <name>Brad</name> 
    </test> 
    <test> 
     <name>Tom</name> 
    </test> 
</tests> 

這是在MainActivity代碼:

public class MainActivity extends ActionBarActivity { 
    ViewPager viewPager; 
    PagerAdapter pagerAdapter; 
    ArrayList<Quote> quotes; 
    ArrayList<Pers> persons; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     InputStream inputStream = getResources().openRawResource(R.xml.test); 

     Fetcher fetcher = new Fetcher(); 
     persons = fetcher.parse(inputStream); 

     String str = new String(); 
     for(int i = 0; i < persons.size(); i++) { 
      str += persons.get(i).getName(); 
     } 
     Log.d("1", str); 
    } 
} 

這是擷取類代碼:

public class Fetcher { 
    private ArrayList<Pers> persons; 
    private Pers person; 
    private String text; 

    public Fetcher() { 
     persons = new ArrayList<Pers>(); 
    } 

    public ArrayList<Pers> parse(InputStream is) { 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 
      parser.setInput(is, null); 
      int eventType = parser.getEventType(); 
      while(eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch(eventType) { 
        case XmlPullParser.START_TAG: 
         if(tagname.equalsIgnoreCase("test")) { 
          person = new Pers(); 
         } 
         break; 
        case XmlPullParser.TEXT: 
         text = parser.getText(); 
         break; 
        case XmlPullParser.END_TAG: 
         if(tagname.equalsIgnoreCase("test")) { 
          persons.add(person); 
         } else if(tagname.equalsIgnoreCase("name")) { 
          person.setName(text); 
         } 
         break; 
        default: 
         break; 
       } 
       eventType = parser.next(); 
      } 
     } catch(XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return persons; 
    } 
} 

爲什麼會出現XmlPullParserException異常?

org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT ��������������������[email protected]:49 in [email protected]) 
+0

因爲有一個未終止的實體參考在你的XML中。 –

+0

@Dave Newton可能你有一些想法如何解決這個問題?我會感激你,如果你能幫助我。 – veinhorn

+0

你是如何創建xml的?你是否創建了一個pla在文本文件中,還是使用文字處理器,從網頁複製等?它可能會有一些二進制或其他垃圾。 –

回答

2

我改變了代碼,現在它的工作。感謝那些試圖幫助我的人。

public class Fetcher { 
    private ArrayList<Pers> persons; 
    private Pers person; 
    private String text; 

    public Fetcher() { 
     persons = new ArrayList<Pers>(); 
    } 

    public ArrayList<Quote> parse(Activity activity) throws XmlPullParserException, IOException { 
     Resources resources = activity.getResources(); 
     XmlResourceParser xmlResourceParser = resources.getXml(R.xml.quotes); 
     person = new Pers(); 
     xmlResourceParser.next(); 
     int eventType = xmlResourceParser.getEventType(); 
     while(eventType != XmlPullParser.END_DOCUMENT) { 
      String tagName = xmlResourceParser.getName(); 
      switch(eventType) { 
       case XmlPullParser.START_TAG: { 
        if(tagName.equalsIgnoreCase("test")) { 
         person = new Pers(); 
        } 
        break; 
       } 

       case XmlPullParser.TEXT: { 
        text = xmlResourceParser.getText(); 
        break; 
       } 

       case XmlPullParser.END_TAG: { 
        if(tagName.equalsIgnoreCase("test")) { 
         persons.add(person); 
        } else if(tagName.equalsIgnoreCase("name")) { 
         person.setId(Integer.parseInt(text)); 
        } 
        break; 
       } 

       default: 
        break; 
      } 
      eventType = xmlResourceParser.next(); 
     } 

     return persons; 
    } 
} 
0

我想這是這一行:parser.setInput(is, null);

因爲XML編碼是UTF-8,我相信你已經將它更改爲parser.setInput(is,"UTF-8");

+0

我設置了utf-8字符集,但沒有任何變化。 – veinhorn

0

我認爲這個問題是在不同的輸入你向我們展示了什麼。或者,也許源代碼是不同的。

  • 錯誤消息似乎指的是一個不存在的位置 - 行1,字符位置49(反之亦然)。

  • 錯誤消息似乎表示一些亂碼字符(或一串NUL),但在示例XML中沒有任何問題。

0

有點晚了,但是,在情況下,它可以幫助別人,檢查:

  • 沒有字符需要在XML文件中逃脫例如&這應該是&#
  • 確保屬性正確地用引號括起來(在我的情況,日食已經有用投入近引號,所以當我增加了近報價在我的文字的結束,它給了一個錯誤

我通過從最外面的標記開始檢查XML,刪除內容並重新添加位,每次運行,以查找錯誤的位置。調試XML文件是一個真正的痛苦!

相關問題