2012-11-16 2 views
3

После нескольких часов поиска и отладки я все еще застрял в одном месте, и Eclipse не помогает мне.Застрял с XmlPullParser в Android

Я пытаюсь синтаксического анализа this rss feed

который довольно просто. Соединение выполнено, и я преобразовываю InputStream как String, это хорошо работает.

Когда я пытаюсь проанализировать полученную строку, у меня нет ошибок или предупреждений, но значения, которые я пытаюсь получить, равны нулю. Вот XML-процесс

public class XmlOperations { 
private static final String ns = null; 

public List parse(String in) throws XmlPullParserException, IOException { 
    try { 

     XmlPullParser parser = Xml.newPullParser(); 
     parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
     parser.setInput(new StringReader(in)); 
     parser.nextTag(); 
     return readFeed(parser); 
    } finally { 
     // 
    } 
} 

private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
    List entries = new ArrayList(); 
    // first xml balise 
    parser.require(XmlPullParser.START_TAG, ns,"rss"); 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     Log.w(TAG, name); // output channel the first time 
     // Starts by looking for the item tag 
     if (name.equals("item")) { 
      **Log.w(TAG, "Never get in here")** 
      entries.add(readEntry(parser)); 
     } else { 
      skip(parser); 
      Log.w(TAG, "lala"); 
     } 
    } 
    return entries; 
} 



// Parses the contents of an item. If it encounters a title, description, or link tag, hands them off 
// to their respective "read" methods for processing. Otherwise, skips the tag. 
private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "item"); 
    String title = null; 
    String description = null; 
    String link = null; 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     if (name.equals("title")) { 
      title = readTitle(parser); 
     } else if (name.equals("description")) { 
      description = readDescription(parser); 
     } else if (name.equals("link")) { 
      link = readLink(parser); 
     } else { 
      skip(parser); 
     } 
    } 
    return new Entry(title, description, link); 
} 

// Processes title tags in the feed. 
private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "title"); 
    String title = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "title"); 
    return title; 
} 

// Processes link tags in the feed. 
private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "link"); 
    String link = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "link"); 
    return link; 
} 

// Processes summary tags in the feed. 
private String readDescription(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "description"); 
    String description = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "description"); 
    //Log.d("vALUE = ", summary); 
    return description; 
} 

// For the tags title and description, extracts their text values. 
private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { 
    String result = ""; 
    if (parser.next() == XmlPullParser.TEXT) { 
     result = parser.getText(); 
     parser.nextTag(); 
    } 
    return result; 
} 

private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { 
    if (parser.getEventType() != XmlPullParser.START_TAG) { 
     throw new IllegalStateException(); 
    } 
    int depth = 1; 
    while (depth != 0) { 
     switch (parser.next()) { 
     case XmlPullParser.END_TAG: 
      depth--; 
      break; 
     case XmlPullParser.START_TAG: 
      depth++; 
      break; 
     } 
    } 
} 

Я полагаю, что ошибка заключается в одном из методов анализа.

В antoher классе у меня есть этот

XmlOperations xml = new XmlOperations(); 
     try { 
      entrieses = xml.parse(result); 
      String lol = null; 
      for(Entry item : entrieses) { 
       //Toast.makeText(getApplicationContext(), item.title, Toast.LENGTH_SHORT).show(); 
       lol = item.link.toString(); 
      } 
      tv.setText("Pin " + lol + " gouin"); 

entreses является Список Входа. И все равно нулевой :(

EDIT: С лог кошки у меня есть канал Лала и все

+0

Можете ли вы показать образец вывода? Также может быть хорошей идеей процитировать некоторые текущие данные rss-фида, если он уйдет или изменится. – itsbruce

+0

В LogCat отсутствуют ошибки или предупреждение. Вывод Textview имеет значение Pin null gouin – Freego

+0

Можно ли попытаться установить контрольную точку, чтобы проверить, добавляет ли ваш 'entries.add 'анализируемые элементы? Или вы можете просто добавить некоторый logcat out, чтобы регистрировать то, что делает парсер. – dumbfingers

ответ

1

я, наконец, узнать. Мой код был прав, мой XML понимание не было. XML, идет как этот

<rss> 
    <channel> 
     <item> 
      <link> </link> 
      <title> </title> 
     </item> 
    </channel> 
</rss> 

Мой код перешел на канал, а затем на следующий канал, но его не существует. Мне просто нужно было добавить parser.Next() в мою функцию reedFeed() непосредственно перед циклом, чтобы передать тег канала и перейти непосредственно к тегу элемента. И это работает :)

0

Я думаю, что линия в вашей readFeed() функции должна быть while (parser.next() != XmlPullParser.END_DOCUMENT) { вместо while (parser.next() != XmlPullParser.END_TAG) {, так как в противном случае это возвращается почти сразу же.

Смежные вопросы