NSXMLParser сбой на неисправном xmls, нет правильной обработки ошибок? - PullRequest
1 голос
/ 25 июля 2010

Кто-нибудь еще испытывает сбои в библиотеках iPhone, когда NSXMLParser анализирует xml-файл с ошибками?Я думал, что это должно было вызвать:

  • (void) parser: (NSXMLParser *) parser parseErrorOccurn: (NSError *) parseError

, но вместо этого происходит сбой всего приложениягде-то внутри _xmlRaiseError.

Кто-нибудь еще испытывает это и есть ли способ уловить это, вместо того, чтобы моя программа вылетала?

Ответы [ 5 ]

1 голос
/ 06 апреля 2011

Обработка ошибок не найдена ни в каркасе TouchXML, ни в CXMLDocument.Он находится в среде libxml, которая (насколько мне известно) выведет строку, но не вызовет исключение.Так что это все о передаче указателя ошибки и последующем его чтении.Если это не ноль, произошла ошибка.Если вы получаете сбой, ошибка должна быть где-то еще ... Надеюсь, это поможет.

0 голосов
/ 22 июля 2011

Я подал это как отчет об ошибке, и через год Apple ответила мне, что это должно быть исправлено в iOS5.

0 голосов
/ 26 июля 2010

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

NSData *data = [[NSData alloc] initWithContentsOfFile:filename];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
MGXMLParser *parser = [[MGXMLParser alloc] initWithRecipient:self];
[xmlParser setDelegate:parser];
BOOL success = [xmlParser parse];
if (success) {
     NSLog(@"No errors");
} else {
    NSError *error = [xmlParser parserError];
    NSLog(@"Errors with xmlParser: %@", [error localizedDescription]);
}
[parser release];
[xmlParser release];
[data release];

MGXMLParser - это мой собственный класс, который является делегатом для синтаксического анализатора XML, на случай, еслиочевидно.

Обновление: упс, ТАК разобрал мой в ничто.

0 голосов
/ 25 января 2011

Проблема, вероятно, в том, что ваша XML-строка автоматически высвобождается до того, как parseErrorOccurred когда-либо вызывается, вызывая вызов объекта dealloc'd.

Решение состоит в следующем:

NSData *data = [[contentString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] retain]; //use a retain, to stop data being autoreleased

NSXMLParser* xmlParse = [[NSXMLParser alloc] initWithData:data];

[xmlParse setDelegate:self];

[xmlParse parse];

[data release]; //now release data
[xmlParse release];
0 голосов
/ 26 июля 2010

Вы можете использовать @try/@catch, чтобы обернуть это, если вам нужно обрабатывать все виды искаженного XML.

...