Разбирать вложенный XML-объект C - NSXMLParser - PullRequest
0 голосов
/ 15 июля 2011

Все,

У меня есть XML в следующем формате:

<linked-list>
    <Description>
        <desc></desc>
        <IP></IP>
    </Description>
</linked-list>

Этот оператор XML может иметь бесконечное число внутри,

Как мне разобрать это с помощью NSXMLParser?Мой текущий код выглядит следующим образом, но он анализирует неправильно.

@implementation XMLParser

@synthesize response;

- (XMLParser *) initXMLParser
{
    self = [super init];
    // init dictionary of response data 
    response = [[NSMutableDictionary alloc] init];
    return self;
}

//Gets Start Element of SessionData
- (void)parser:(NSXMLParser *)parser 
        didStartElement:(NSString *)elementName 
        namespaceURI:(NSString *)namespaceURI 
        qualifiedName:(NSString *)qualifiedName 
        attributes:(NSDictionary *)attributeDict 
{
    if ([elementName isEqualToString:@"linked-list"])
    {
        NSLog(@"Found linked-list in the return XML! Continuing...");
        //response is a NSMutableArray instance variable

        //THIS SHOULD NEVER NEED TO BE USED
        if (!response)//if array is empty, it makes it!
        {
            NSLog(@"Dictionary is empty for some reason, creating...");
            response = [[NSMutableDictionary alloc] init];
        }
        //END: THIS SHOULD NEVER BE USED
        return;
    }
    else
    {
        currentElementName = elementName;
        NSLog(@"Current Element Name = %@", currentElementName);
        return;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{
    if (!currentElementValue) {
        // init the ad hoc string with the value     
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    } else {
        [currentElementValue setString:string];
        NSLog(@"Processing value for : %@", string);
    }
}  

//Gets End Element of linked-list
- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:@"linked-list"])
    {
        // We reached the end of the XML document
        // dumps dictionary into log
        NSLog(@"Dump:%@", [response description]);
        return;
    }
    else
    {
        //Adds key and object to dictionary
        [response setObject:currentElementValue forKey:currentElementName];
        NSLog(@"Set values, going around again... brb.");
    }
    currentElementValue = nil;
    currentElementName = nil;
}


@end

1 Ответ

4 голосов
/ 15 июля 2011

Некоторые наблюдения:

  1. Бесконечное число ЧТО внутри ЧТО?

  2. Предполагается, что может быть более одного Descriptionelement, внешняя структура данных, в которой вы храните содержимое, должна быть NSMutableArray, а не словарем.Затем вы используете один изменяемый словарь для каждого элемента Description.

  3. Следовательно, в didStartElement: проверьте, является ли имя элемента @"Description" и, если это так, создайте новый NSMutableDictionaryэкземпляр, который вы храните в ivar.

  4. В foundCharacters: вам всегда нужно добавлять новые символы к существующему currentElementValue, потому что метод может вызываться несколько раз для каждого элементасодержание.Я вижу, что многие люди делают это неправильно, несмотря на то, что пример кода Apple четко демонстрирует правильный путь.

  5. В didEndElement:, сделайте следующее:

    • Если имя элемента @"desc" или @"IP", присвойте currentElementValue соответствующему ключу в текущем изменяемом словаре.Не забудьте выпустить currentElementValue, прежде чем установить nil.В настоящее время у вас есть утечка памяти в вашем коде, потому что вы этого не делаете.

    • Если имя элемента @"Description", добавьте текущий изменяемый словарь в изменяемый массив.Выпустите словарь и установите значение ивара на nil.Новый словарь будет создан в следующий раз, когда вы встретите элемент @"Description" в didStartElement:.

    • Если имя элемента @"linked-list", изменяемый массив будет содержать все словарии все готово.

...