Мне трудно создать и заполнить на лету NSMutableDictionary из древовидной структуры.
Допустим, у вас есть узел, где
node.attributes
извлекает NSArray
пар ключ/значение
и
node.children
извлекает NSArray
узлов одного и того же типа.
как вы можете преобразовать это дерево во вложенное NSMutableDictionary
?
мой подход состоит в том, чтобы попытаться создать NSMutableDictionary
для каждого узла и заполнить его его атрибутами и дочерними элементами, создать новый NSMutableDictionary
для каждого дочернего элемента и снова выполнить итерацию с ним... это звучит как рекурсия, не так ли
Следующий код работает для одного уровня в глубину (родительский и дочерний), но выдает SIGABRT для внуков и выше.
[self parseElement:doc.rootElement svgObject:&svgData];
где
-(void) parseElement:(GDataXMLElement*)parent svgObject:(NSMutableDictionary**)svgObject
{
NSLog(@"%@", parent.name);
for (GDataXMLNode* attribute in parent.attributes)
{
[*svgObject setObject:attribute.stringValue forKey:attribute.name];
NSLog(@" %@ %@", attribute.name, attribute.stringValue);
}
NSLog(@" children %d", parent.childCount);
for (GDataXMLElement *child in parent.children) {
NSLog(@"%@", child.name);
NSMutableDictionary* element = [[[NSMutableDictionary alloc] initWithCapacity:0] retain];
NSString* key = [child attributeForName:@"id"].stringValue;
[*svgObject setObject:element forKey:key];
[self parseElement:child svgObject:&element];
}
}
ОБНОВИТЬ:
спасибо за ваши ответы, мне удалось заставить код работать
очевидно, GDataXMLElement не отвечает на attributeForName, когда нет атрибутов, и поэтому мой код выдал некоторые исключения, которые трудно отлаживать, поскольку это рекурсивный метод
Я также принимаю во внимание все ваши предложения (связанные с передовой практикой).
С Уважением