NSXMLParser - сбор информации о родителях и детях? iPhone - PullRequest
1 голос
/ 14 февраля 2012

У меня есть XML-файл с родительской дочерней структурой, такой как:

<geometry id="001-mesh" name="001">
  <mesh>
    <source id="001-mesh-positions">
      <float_array id="001-mesh-positions-array" count="228">

Я могу успешно проанализировать данные с помощью NSXMLParser. Однако проблема в том, что я хочу сохранить дочернюю информацию по отношению к родителю - например, когда обнаружен идентификатор геометрии, я хочу сохранить связанный идентификатор источника и идентификатор float_array.

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

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict {

// NSLog(@"Parse Started");
//NSLog(@"Element Name is %@", elementName);

if([elementName isEqualToString:@"geometry"]) { 
    NSLog(@"Object Detected");
    NSString *name = [attributeDict objectForKey:@"name"];

NSLog(@"Name is %@",name);
}

if ([elementName isEqualToString:@"float_array"]) {
    NSLog(@"Vertices Detected");
    NSString * vertices = [attributeDict objectForKey:@"count"];

    NSLog(@"Vertices are %@", vertices);
}

}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Используйте переменную класса или глобальную переменную для хранения текущих значений id геометрии.

0 голосов
/ 14 февраля 2012

В то время, когда анализатор обнаруживает тег geometry, идентификатор источника и идентификатор float_array недоступны: они еще не проанализированы.Обычный трюк - дождаться дочернего элемента и выполнить обработку, когда он станет доступным.Вы можете сделать это, создав новый объект Geometry (или любой другой, соответствующий тегу XML geometry в вашей модели), и сделать его доступным для метода didStartElement:...:, например, установив его в ивар с именем myGeometry.,Как только вы обнаружите элемент float_array, проанализируйте его id и вызовите

[myGeometry setId:floatArrayId];
...