Помощь в устранении ошибки NSXMLParser 39: NSXMLParserAttributeNotStartedError - PullRequest
7 голосов
/ 02 августа 2010

Я искал около двух часов, пытаясь выяснить, что это за ошибка и как ее устранить.В документах Apple с радостью говорится, что

NSXMLParserAttributeNotStartedError Атрибут не запущен.Доступный в Mac OS X v10.3 и позже.Объявлен в NSXMLParser.h.

, но не может оказать какую-либо помощь.Может кто-нибудь помочь мне здесь?Любое движение в правильном направлении очень ценится.

В viewDidLoad у меня есть:

NSURL *xmlUrl = [NSURL fileURLWithPath:xmlFilepath];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlUrl];
[xmlParser setDelegate:self];
[xmlParser setShouldResolveExternalEntities:NO];
BOOL success = [xmlParser parse];

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

Остальная часть соответствующего кода выглядит следующим образом:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
 if([elementName isEqualToString:@"foo"]) {
  foo = [[NSMutableArray alloc] init];
 } else if([elementName isEqualToString:@"bar"]) {
  bar = [[Bar alloc] init];
 }
}

- (void)parser:(NSXMLParser *)parser foundAttributeDeclarationWithName:(NSString *)attributeName forElement:(NSString *)elementName type:(NSString *)type defaultValue:(NSString *)defaultValue {
  if ([elementName isEqualToString:@"bar"]) {
  if ([attributeName isEqualToString:@"barAttrib1"]) {
   [bar setBarAttrib1:[defaultValue intValue]];
  } else if ([attributeName isEqualToString:@"barAttrib2"]) {
   [bar setBarAttrib2:defaultValue];
  } 
 }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
 // nothing inside the elements, just attributes
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
 if ([elementName isEqualToString:@"bar"]) {  
  [foo addObject:bar];  
  [bar release];
  bar = nil;
 }
}

Заранее спасибо.

РЕДАКТИРОВАТЬ: пример xml

<foo>
  <bar barAttrib1=1 barAttrib2="hello" />
  <bar barAttrib1=2 barAttrib2="world" />
</foo>

1 Ответ

7 голосов
/ 02 августа 2010

Если это XML, то кавычки ОБЯЗАТЕЛЬНО вокруг значения атрибута.Попробуйте

<foo>
  <bar barAttrib1="1" barAttrib2="hello" />
  <bar barAttrib1="2" barAttrib2="world" />
</foo>

Обратите внимание на кавычки вокруг значений barAttrib1

...