2014-10-17 4 views
-1

В настоящее время я пытаюсь проанализировать некоторые XML с помощью XmlResourceParser, а затем показать информацию в ListView с помощью ArrayAdapter. Проблема в том, что у меня нет результатов муравьев.Анализ XML ничего не возвращает

Моя структура XML, как это:

<resources> 

<categories> 
    <animal> 
     <word> 
      <english>Animal</english> 
      <french>Animal</french> 
      <spanish>Animal</spanish> 
      <portuguese>Animal</portuguese> 
     </word> 
    </animal> 
    <transportation></transportation> 
    <location></location> 
    <clothing></clothing> 
    <color></color> 
    <people></people> 
    <job></job> 
    <society></society> 
    <art></art> 
    <beverages></beverages> 
    <food></food> 
    <home></home> 
    <electronics></electronics> 
    <body></body> 
    <nature></nature> 
    <material></material> 
    <math></math> 
    <directions></directions> 
    <seasons></seasons> 
    <numbers></numbers> 
    <months></months> 
    <days></days> 
    <time></time> 
    <verbs></verbs> 
    <adjectives></adjectives> 
</categories> 

Теперь каждая категория будет иметь разные слова на них, но в этот момент я только хочу, чтобы получить все категории и показать их в Посмотреть список. Для того, чтобы попытаться получить все категории я использую следующий код:

public class MainActivity extends ActionBarActivity { 

private ListView list; 
private ArrayList<String> arrayCategories; 

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

    list = (ListView) findViewById(R.id.listView1); 

    try { 
     arrayCategories = parseCategories(); 

     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
       this, 
       R.id.listView1, 
       arrayCategories); 

     list.setAdapter(arrayAdapter); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

и функция parseCategories заключается в следующем:

private ArrayList<String> parseCategories() throws IOException { 
    ArrayList<String> categories = new ArrayList<String>(); 
    XmlResourceParser parser = getResources().getXml(R.xml.database); 

    try { 
     int eventType = parser.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      if (eventType == XmlPullParser.START_TAG) { 
       if (parser.getName().equals("categories")) { 
        categories.add(parser.nextText()); 
       } 
      } 

      eventType = parser.next(); 
     } 
    } catch (XmlPullParserException e) { 
     Log.e("XmlPullParserException", e.toString()); 
    } 
    parser.close(); 

    return categories; 
} 

Я все еще немного неопытный, когда дело доходит до разбора xml, можете ли вы, ребята, помочь мне с этим?

+1

В элементе категорий нет «текста», только больше элементов. (Только текст находится в тегах, таких как ' Animal', change '.equals (" categories ")' to '.equals (" english ")', чтобы видеть.) – user2864740

+1

Мне это нужно получить помощь мой уже ответ вопрос. [Нажмите здесь] [1] [1]: http://stackoverflow.com/questions/26397647/how-to-make-rss-news-reader-application-in-android/26398110 # 26398110 –

+0

Итак, в основном вы говорите, что мне нужно «жестко закодировать» категории, но как я узнаю, к какой категории принадлежит конкретное слово? –

ответ

1

Проблема в том, что в элементе категорий нет «текста»; однако существует множество дочерних элементов.

Реальная задача может быть тривиальным резюмировать:

Как получить имена всех элементов, которые являются прямыми потомками категорий элемента?

Эта проблема сделана немного осложненное XmlPullParser (с помощью DOM и/или XPath было бы гораздо проще), но это выполнимо. Хитрость здесь заключается в том, чтобы «пропустить» поддеревья, удерживая небольшой счетчик глубины; рекурсивные функции также будут работать.

int eventType = parser.getEventType(); 
while (eventType != XmlPullParser.END_DOCUMENT) { 

    if (eventType == XmlPullParser.START_TAG 
     && parser.getName().equals("categories")) { // catergories start 

    int depth = 0; 
    eventType = parser.next(); 
    while (!(depth == 0 && eventType == XmlPullParser.END_TAG)) { // end categories 

     if (eventType == XmlPullParser.START_TAG) { 
     if (depth == 0) { // direct child of categories 
      categories.add(parser.getName()); 
     } 
     depth++; 
     } else if (eventType == XmlPullParser.END_TAG) { // depth > 0 
     depth--; 
     } 

     eventType = parser.next(); 
    } 

    } 

    eventType = parser.next(); 
}