Разбор XML-данных или преобразование в NSDictionary? - PullRequest
0 голосов
/ 22 января 2012

У меня есть XML-данные, которые получены с сервера, и мне нужно удалить некоторые их части, чтобы настроить просмотр таблицы.Я преобразовываю эти данные в NSDictionary, но я думаю, что было бы легче проанализировать (это правильное слово?) Данные XML, а не связываться с ними, когда они уже преобразованы.Вот пример данных xml.

 <?xml version="1.0" encoding="UTF-8"?>
 <response status="ok">
 <rosters records_per_page="50" page_count="1" page="1" total_record_count="11">
 <roster class_id="685343" role="T" user_id="968428" roster_id="16257539">
 <class name="Haiku API Keys" shortname="haiku_api" end_date="2011-12-20" code=""      
 import_id="" id="685343" description="" teacher_id="971456" year="2012" 
 organization_id="134146" active="false"/>
 </roster>
 <roster class_id="512296" role="S" user_id="968428" roster_id="10456326">
 <class name="Physics AP" shortname="physics-ap_0406-01" end_date="2012-05-02" 
 code="PHYSICSA_0406-01" import_id="0406-01-2012" id="512296" description="DESCRIPTION" 
 teacher_id="968968" year="2012" organization_id="134148" active="true"/>
 </roster>

То, что я хочу сделать, - это удалить данные, у которых есть объект «ложь» для ключа «активный».Это оставило бы мне данные с именем класса Физики AP.Можно ли это сделать с данными XML или я должен попытаться удалить эти данные, если это NSDictionary?Вот как выглядит конвертированный NSDictionary.

 (
 {
response =     {
    "@status" = ok;
    rosters =         {
        "@page" = 1;
        "@page_count" = 1;
        "@records_per_page" = 50;
        "@total_record_count" = 11;
        roster =             (
                            {
                "@class_id" = 685343;
                "@role" = T;
                "@roster_id" = 16257539;
                "@user_id" = 968428;
                class =                     {
                    "@active" = false;
                    "@code" = "";
                    "@description" = "";
                    "@end_date" = "2011-12-20";
                    "@id" = 685343;
                    "@import_id" = "";
                    "@name" = "Haiku API Keys";
                    "@organization_id" = 134146;
                    "@shortname" = "haiku_api";
                    "@teacher_id" = 971456;
                    "@year" = 2012;
                };
            },
                            {
                "@class_id" = 512296;
                "@role" = S;
                "@roster_id" = 10456326;
                "@user_id" = 968428;
                class =                     {
                    "@active" = true;
                    "@code" = "PHYSICSA_0406-01";
                    "@description" = "DESCRIPTION";
                    "@end_date" = "2012-05-02";
                    "@id" = 512296;
                    "@import_id" = "0406-01-2012";
                    "@name" = "Physics AP";
                    "@organization_id" = 134148;
                    "@shortname" = "physics-ap_0406-01";
                    "@teacher_id" = 968968;
                    "@year" = 2012;
                };
            },
            }

То, как отформатированы XML-данные, заставляет меня думать, что это будет легче сделать, проанализировав его, но я не знаю, возможно ли это,или какой метод использовать.Если у вас есть способ сделать это, используя данные xml или NSDictionary, я хотел бы услышать это.Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 22 января 2012

Я использую тот же XMLReader, который вы использовали, и мне это нравится.

Если бы я решил проблему, вот мое решение, после того, как вы получили словарь, вам просто нужно создать новыймассив словаря, в частности, новый массив списка, например:

NSArray *roster = [[[theDictionary objectForKey:@"response"] objectForKey:@"rosters"] objectForKey:@"roster"];

NSMutableArray *newRoster = [[NSMutableArray alloc] init];

for(int i=0;i<[roster count];i++){
    NSDictionary *aRoster = [roster objectAtIndex:i];
    //filter the array and add it to the mutable array
    if([[[aRoster objectForKey:@"class"] objectForKey:@"@@active"] isEqualToString:@"true"])
    {
        //this way we only add those data whose active is "true"
        [newRoster addObject:aRoster];
    }
}

//do what you want with the new roster
NSLog(@"newRoster = %@",newRoster);

В этом случае я просто предполагаю, что вы будете использовать только массив тегов "roster" и хотите удалить тетеги, атрибуты «active» которых равны строке «false».

Не забудьте выпустить newRoster, когда закончите с ним.

Работа с XMLReader довольно утомительна, когдачто касается атрибутов, исправьте меня, если у меня есть какие-то ошибки, так как у меня нет Mac для использования сегодня

0 голосов
/ 22 января 2012

Если вы новичок в разборе xml в задаче c, я бы посоветовал вам использовать TBXML (http://tbxml.co.uk/) library .. проанализировать ваш xml с помощью этой библиотеки и сохранить то, что вы хотите, в массиве или словаре (оставьте то, что вы не делаете хочу) .. и использовать массив или словарь для создания таблицы ..

...