Парсинг так RSS-канала с помощью TouchXML, никаких тегов не найдено


Я пытаюсь разобрать переполнение стека RSS-канал конкретного вопроса: 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

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

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

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

Спасибо.

2 3

2 ответа:

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

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

Более простой способ-это просто изменить

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

Заменяется просто

<html>

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

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