Objective-C [[NSXMLDocument alloc] initWithContentsOfURL: параметры URL: 0 ошибка: & ошибка];Помогите - PullRequest
1 голос
/ 14 февраля 2011

Мне нужна небольшая помощь, у меня есть поле поиска и кнопка, которые вызывают этот метод, но я получаю ошибку ниже.

- (IBAction)fetchTracks:(id)sender {

NSString *input = [searchField stringValue];
NSString *searchString = [input stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"searchString: %@", searchString);

NSError *error;
NSString* libraryPath = [[NSString alloc] initWithString:@"~/Music/iTunes/iTunes Music Library.xml"];
NSURL *url = [NSURL URLWithString:libraryPath];

[doc release];
doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:&error];

NSLog(@"doc: %@", doc);

[itemNodes release];
itemNodes = [[doc nodesForXPath:@"ItemSearchResponse/Items/Item" error:&error] retain];

[tableView reloadData];
}

* - [NSXMLDocument initWithContentsOfURL: options:ошибка:]: ноль аргумент

Может кто-нибудь помочь, спасибо, Сами.

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Вам нужно экранировать пробелы в вашем коде. Например, вот так

  libraryPath = [libraryPath stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

Когда я добавляю это, ваш код не падает.
Но в целом я бы рекомендовал обращаться к файлам как к файлам (например, NSString stringWithContentsOfFile). Это сделает вашу жизнь проще.

Вы можете увидеть список символов, которые URL не может содержать здесь :

Опасное:

Символы могут быть небезопасными по ряду причин. Космос символ небезопасен, потому что значительные пробелы могут исчезнуть и незначительные пробелы могут быть введены, когда URL транскрибируются или набрано или подвергнуто обработке программ обработки текста.

1 голос
/ 14 февраля 2011

Изменить эту строку:

NSError *error;

К этому:

NSError *error = nil;

Прочтите этот вопрос для получения дополнительной информации о том, почему это работает: NSError: действительно ли использование nil для обнаружения ошибки отключает отчеты об ошибках?


Однако вам, похоже, совсем не нужен объект ошибки, поэтому вам лучше просто вызвать эти методы следующим образом (замените &error на NULL)

doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:NULL];
...
itemNodes = [[doc nodesForXPath:@"ItemSearchResponse/Items/Item" error:NULL] retain];
0 голосов
/ 14 февраля 2011

Я думаю, вам может понадобиться:

NSString *urlString = [@"~/Music/iTunes/iTunes Music Library.xml" stringByExpandingTildeInPath];
NSString* libraryPath = [[NSString alloc] initWithString:urlString];
...