XML: анализ через вложенные узлы внутри узлов и разделение по разделам - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть следующая схема XML, которую я пытаюсь перебрать:

<routes>
     <route>
          <group>Group Name - Will be iPhone section name</group>
          <item>
                <name>Route Name - Will be iphone cell lable</name>
                <url>Route URL - View Did select lable</url>
          </item>
          <item>
                <name>Route Name - Will be iphone cell lable</name>
                <url>Route URL - View Did select lable</url>
          </item>
          <item>
                <name>Route Name - Will be iphone cell lable</name>
                <url>Route URL - View Did select lable</url>
          </item>
          <item>
                <name>Route Name - Will be iphone cell lable</name>
                <url>Route URL - View Did select lable</url>
          </item>
     </route>
   <route>
          <group>Group 2 - Will be iPhone section name</group>
          <item>
                <name>Route Name - Will be iphone cell lable</name>
                <url>Route URL - View Did select lable</url>
          </item>         
          <item>
                <name>Route Name - Will be iphone cell lable</name>
                <url>Route URL - View Did select lable</url>
          </item>
     </route>
</routes>

Теперь у большинства из них довольно много записей в элементе - и узел Group будет заголовком раздела для UITableView

Вот как я (неправильно) анализирую XML на данный момент:

(Вот объявления xNode_:)

static NSString *xNode_route =@"//route";
static NSString *xNode_group =@"group";
static NSString *xNode_item= @"//item";
static NSString *xNode_name = @"name";
static NSString *xNode_url = @"url";

Вот код разбора:

    CXMLDocument *doc = [[CXMLDocument alloc] initWithData:dataReply options:0 error:nil];
    NSArray *route = [doc nodesForXPath:xNode_route error:nil];//Root node
    for (CXMLElement *item in route) 
    {
        AssessObject *newobj2 = [[AssessObject alloc] init];
        NSArray *arryGroup = [item elementsForName:xNode_group];
        for(CXMLElement *assGroup in arryGroup) 
        {

            newobj2.assGroup = assGroup.stringValue;
            NSLog(@"Assessment Group: %@", assGroup.stringValue);

        }   

        [groupArray addObject:newobj2];


    }

    NSArray *items = [doc nodesForXPath:xNode_item error:nil];//Root node
    for (CXMLElement *item in items) 
    {
        AssessObject *newobj = [[AssessObject alloc] init];
        NSArray *arryName = [item elementsForName:xNode_name];
        for(CXMLElement *assName in arryName) 
        {

            newobj.assName = assName.stringValue;
            NSLog(@"Assessment Name: %@", assName.stringValue);

        }

        NSArray *arryUrl = [item elementsForName:xNode_url];
        for(CXMLElement *assUrl in arryUrl) 
        {

            newobj.assUrl = assUrl.stringValue;
            NSLog(@"Assessment URL: %@", assUrl.stringValue);


        }

            [totalArray addObject:newobj];
    }
}   

В данный момент он просматривает все элементы x количество групп, поэтому циклы где-то некорректны. Так что, если есть 6 групп, он показывает дубликаты предметов 6 раз.

Итак, это часть первая, часть вторая, на самом деле, как мне разделить массивы на группы и получить правильные элементы внутри них?

1 Ответ

0 голосов
/ 21 ноября 2011

Во-первых, вы неправильно освобождаете память.

У вас есть 6 заявлений о выпуске в размещенном коде - удалите их все.

Затем вам нужно добавить два оператора:

 [release newObj2];

для объектов, которые вы явно выделяете: newObj и newObj2, сразу после добавления их в массив.

Тогда, если что-то не работает, мы можем поговорить о разборе.

Edit: Хорошо, давайте поговорим о разборе:

+ (NSMutableArray *) parseResponseString:(NSString *) responseString {
NSError *error;
CXMLDocument *doc = [[CXMLDocument alloc] initWithXMLString: responseString
                                                    options: 0
                                                      error: &error];
if ( error ) {
    NSLog(@"CXMLDocument error: %@", [error description]);
    [doc release];
    return nil;
} 


CXMLElement * el = [doc rootElement];
NSMutableArray *theRoutes = [NSMutableArray arrayWithCapacity:128];  // adjust to your needs

if ( [[el name] isEqualToString:@"routes"] ) {                       // parameterize these string constants
    for ( CXMLElement *childElement in [el children] ) {
        if ( [[childElement name] isEqualToString:@"route"] ) {
            Route *aRoute = [[Route alloc] init];

            for ( CXMLElement *grandChild in [childElement children] ) {
                if ( [[grandChild name] isEqualToString:@"group"] ) {
                    aRoute.group = [grandChild stringValue];
                } else if ( [[grandChild name] isEqualToString:@"item"] ) {
                    RouteItem *aRouteItem = [[RouteItem alloc] init];

                    for ( CXMLElement *subItem in [grandChild children] ) {
                        if ( [[subItem name] isEqualToString:@"name"] ) {
                            aRouteItem.name = [subItem stringValue];
                        } else if ( [[subItem name] isEqualToString:@"url"] ) {
                            aRouteItem.url = [subItem stringValue];
                        }
                    }

                    if ( aRouteItem && aRouteItem.name && aRouteItem.url ) {
                        [aRoute.routeItems addObject:aRouteItem];
                    }
                    [aRouteItem release];
                }
            }

            if ( aRoute && aRoute.group && aRoute.items.count ) {
                [theRoutes addObject:aRoute];
            }
            [aRoute release];
        }
    }
}
[doc release];
return theRoutes;   // this is your array for your tableview data source.

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...