«Невозможно загрузить контент с веб-сайта», пока NSXMLParser initWithData - PullRequest
1 голос
/ 16 июля 2010

В настоящее время я пытаюсь проанализировать строку xml, которая у меня уже есть (веб-вызовы не требуются). Мое приложение родной iPhone в Objective-C. Я настроил класс делегата NSXMLParser, который использует initWithData: xmlData. По какой-то причине первым и единственным обратным вызовом в моем делегате является синтаксический анализатор: parseErrorOccurnated со следующим текстом:

"Unable to download content from web site (Error code 5 )"

Очевидно, это не имеет смысла, поскольку я ничего не прошу из Интернета. Может быть, он все еще использует какое-то частное свойство URL для вызова чего-то?

Вот код:

Класс делегата XmlParser:

- (void)parseXmlString:(NSString *)xml parseError:(NSError **)error {
    DEBUG_NSLog(@"XML Parser: Called with string: %@", xml);

    NSData *xmlData = [xml dataUsingEncoding:NSASCIIStringEncoding];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];

    // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
    if (parser != nil) {
        [parser setDelegate:self];
        [parser setShouldProcessNamespaces:NO];
        [parser setShouldReportNamespacePrefixes:NO];
        [parser setShouldResolveExternalEntities:NO];
        [parser parse];

        NSError *parseError = [parser parserError];
        if (parseError && error) {
            *error = parseError;
        }

        [parser release];
    }
}

Вызывается с:

XmlParser *parser = [[XmlParser alloc] init];
NSError *error = nil;
[parser parseXmlString:aString parseError:&error];
if (error) {
  DEBUG_NSLog(@"ERROR FROM PARSER");
}

где aString - строка NSString, содержащая XML (примечание: без заголовка).

Ошибка обратного вызова, который называется:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSString * errorString = [NSString stringWithFormat:@"Unable to download content from web site (Error code %i )", [parseError code]];
    DEBUG_NSLog(@"XML Parser ERROR: %@", errorString);
    [parser abortParsing];
}

Когда код запускается, parseErrorOccururred сразу после [parser parse], и ​​да, я реализовал каждый из didStartDocument, didEndDocument и т. Д.

Спасибо!

UPDATE:

При отладке создается впечатление, что создаваемый мною объект xmlData имеет размер 0 байт, хотя в строке xml, которую я передаю dataUsingEncoding, много данных. Проблема с кодировкой?

Один из элементов xml содержит вложенный html. Я думаю, что "и" может быть проблемой. Надеюсь, что "-> \" это исправит.

Ни экранирование кавычек, ни замена & & на & не устранила проблему. Может быть что-то не так с наличием тега в строке?

Ответы [ 4 ]

1 голос
/ 17 июля 2010

При работе с XML первая ошибка синтаксического анализа всегда фатальна.Если есть ошибка синтаксического анализа, это недопустимый XML.

Вы должны закодировать необработанный HTML в сущности HTML.Использование необработанного HTML-кода (из пользовательского или стороннего источника) в приложении считается плохой идеей ™.

1 голос
/ 16 июля 2010

Ваше сообщение об ошибке скрывает фактическую ошибку.Кажется, что ваша xmlstring недействительна, так как код ошибки «Код ошибки 5».Смотрите этот другой ТАК вопрос. NSXMLparser errorcode 5

Обновление

При создании вашего экземпляра xmlData используйте NSUTF8StringEncoding вместо NSASCIIStringEncoding. Если это не удается, отправьте фактическую строку.Передача пустого объекта данных парсеру вызывает ошибку.

1 голос
/ 17 июля 2010

Вы не можете использовать символы <> в xml. Замените их на:

< = &lt;

> = &gt;
1 голос
/ 16 июля 2010

Я пробовал приведенный выше код с примером XML DATA - он прекрасно работает. Похоже, что есть некоторая проблема с данными XML, которые вы передаете в функцию.

Проверьте свои данные XML или поделитесь своими XML-данными для дальнейшего анализа ...

...