Парсинг SO RSS-канала с использованием TouchXML, теги <entry>не найдены - PullRequest
3 голосов
/ 03 февраля 2010

Я пытаюсь проанализировать RSS-поток Stack Overflow по конкретному вопросу: https://stackoverflow.com/feeds/question/2110875

Для этого я использую библиотеку TouchXML. Кажется, проблема в следующем коде:

CXMLDocument *parser = [[CXMLDocument alloc] initWithData:sourceData options:0 error:nil];
NSArray *allEntries = [parser nodesForXPath:@"//entry" error:nil];
NSLog(@"Found entries: %d",[allEntries count]); //Returns 0

Оператор NSLog должен возвращать количество всех записей в ленте. В этом случае это должно быть '3', проблема в том, что он возвращает 0.

Я обнаружил, что этот кусок кода работает:

CXMLDocument *preParser = [[CXMLDocument alloc] initWithData:sourceData options:0 error:nil];
NSString *sourceStringUTF8 = [preParser XMLString];
[preParser release];

CXMLDocument *parser = [[CXMLDocument alloc] initWithData:[sourceStringUTF8 dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
NSArray *allEntries = [parser nodesForXPath:@"//entry" error:nil];
NSLog(@"Found entries: %d",[allEntries count]); //Returns 3, which is ok

Но использование этого может показаться хакерским (возможно, так и есть) и привносит несколько других случайных ошибок.

Насколько я знаю, выражение Xpath правильное. Я проверил это, используя эту страницу.

Может кто-нибудь помочь мне с этой проблемой или указать мне правильное направление.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2010

У меня была очень похожая проблема. Это как-то связано с пространством имен xml, которое TouchXML не очень хорошо поддерживает (известная проблема).

Я считаю, что в вашем хаке пространство имен не было передано во второй парсер, поэтому оно работает.

Проще всего поменять

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

заменено просто

<html>

и xPath теперь работает.

0 голосов
/ 03 февраля 2010

Может быть, начать с фактического использования этого аргумента error для nodesForXPath:error, чтобы увидеть, возвращает ли он ошибку?И проверьте, не является ли allEntries не nil после этого вызова?

...