Анализатор XML с NSXMLParser - PullRequest
       17

Анализатор XML с NSXMLParser

3 голосов
/ 18 ноября 2010

Привет, ребята, у меня вопрос с разбором xml. Обычно стиль файла XML выглядит следующим образом:

<person>
     <name> abc </name>
     <age> 19 </age>
     <gender> male </gender> 
</person>

Таким образом, мы используем

elementName isEqualToString:@"name"
elementName isEqualToString:@"age"
elementName isEqualToString:@"gender"

для идентификации элемента.

Теперь я сталкиваюсь со стилем XML-файла, как:

<person>
     <element type="name">abc</element>
     <element type="age">19</element>
     <element type="gender">male</element> 
</person>

В этой ситуации мы не можем использовать

elementName isEqualToString:@"name"

Итак, я попытался использовать

if ([elementName isEqualToString:@"element"]) {
   if ([[attributeDict objectForKey:@"type"] isEqualToString:@"name"){
      .....
   }
}

, чтобы идентифицировать «имя», но оно не дало мне никакого значения, ничего, если бы я попытался получить значение «имени».

Итак, у кого-нибудь есть предложения по решению этой проблемы? спасибо

PS: вот часть моего кода

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


    if ( [elementName isEqualToString:@"area"]) {
        if ([[attributeDict objectForKey:@"type"] isEqualToString:@"location"]) {
            NSString *description = [attributeDict objectForKey:@"description"];

            NSArray *lineEntry = [[NSArray alloc] initWithObjects:description,nil ];
            NSArray *lineKeys = [[NSArray alloc] initWithObjects:@"description",nil];
            NSDictionary *dictItem = [[NSDictionary alloc] initWithObjects:lineEntry forKeys:lineKeys];

            [lineKeys release];
            [lineEntry release];

            [dataLoad addObject:dictItem];
            [dictItem release];
        }

    }

    if ([elementName isEqualToString:@"forecast-period"]) {

        NSString *index = [attributeDict objectForKey:@"index"];
        NSString *time = [attributeDict objectForKey:@"start-time-local"];


        NSArray *indexEntry = [[NSArray alloc] initWithObjects:index,time,nil];
        NSArray *indexKey = [[NSArray alloc] initWithObjects:@"index",@"start-time-local",nil];

        NSDictionary *dicIndex = [[NSDictionary alloc] initWithObjects:indexEntry forKeys:indexKey];

        [indexEntry release];
        [indexKey   release];

        [weatherLoad addObject:dicIndex];
        [dicIndex release];


    }
}

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

<forecast-period index="1" start-time-local="2010-11-19T00:00:00+11:00" end-time-local="2010-11-20T00:00:00+11:00" start-time-utc="2010-11-18T13:00:00Z" end-time-utc="2010-11-19T13:00:00Z">
<element type="forecast_icon_code">1</element>
<element type="air_temperature_minimum" units="Celsius">12</element>
<element type="air_temperature_maximum" units="Celsius">24</element>
<text type="precis">Sunny.</text>
</forecast-period>

Есть предложения? Кстати, весь XML-файл находится здесь: ftp: //ftp2.bom.gov.au/anon/gen/fwo/IDV10753.xml

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Я предполагаю, что вы хотите, чтобы все "элементы" периода прогноза были добавлены в тот же словарь, в который вы поместили индекс и start-time-local??

Ваша исходная базовая инструкция if, опубликованная в вопросе, в порядке, но проблема в том, что с NSXMLParser каждый тег xml («period-period», «element», «text» и т. Д.) Вызывает метод didStartElement .

Поскольку имеется несколько тегов «прогнозируемый период» и несколько тегов «элемент», ваш код должен будет отслеживать текущий родительский тег / объект. После обработки тега «period-period» didStartElement снова запустится для следующего тега «element». В этом вызове параметры метода не будут указывать на то, что этот «элемент» является дочерним по отношению к «прогнозному периоду» с «индексом» 1. Ваш код должен отслеживать это.

Кроме того, поскольку теги "element" имеют фактические значения (например, "Sunny" для type = precis), вам придется реализовать foundCharacters и didEndElement.

В didEndElement, основываясь на том, что является текущим целевым объектом, вы должны поместить данные в нужное место. Если это конец «периода прогноза», ничего не делайте (это не имеет значения). Если это конец тега «element», вы должны взять значение, полученное с помощью foundCharacters, и добавить его в последний словарь в weatherLoad. Это также означает, что вам нужно перейти на использование NSMutableDictionary вместо NSDictionary.

Ссылка, которую дал вам @itsaboutcode, является хорошим примером всего вышеперечисленного (она находится над разделом «Атрибуты обработки».

0 голосов
/ 18 ноября 2010

Прочтите раздел «Обработка атрибутов» в Apple Event-Driven XML Programming, и вы получите ответ.

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/XMLParsing/Articles/HandlingElements.html#//apple_ref/doc/uid/20002265-1001969

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