NSXMLParser делегат Обработка атрибутов - PullRequest
1 голос
/ 12 октября 2011

В настоящее время я пытаюсь заставить моих делегатов синтаксического анализатора работать с пользовательским NSObject, который я создал для атрибутов xml, который я получаю ..

Это XML, который читается моим делегатам парсера

<Rows>
<Row SKATERID="706" MANUFACTURER="GAZ" ISFACT="F" ISSKATE="F"/>
<Row SKATERID="318" MANUFACTURER="MAN" ISFACT="F" ISSKATE="T"/>
//...
</Rows>

Вот что у меня есть для моего -parser:didStartElement:namespaceURI:qualifiedName:attributes: метода:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ( [elementName isEqualToString:@"Row"]) {

        manufactureNSObject = [[ManufactureNSObject alloc] init];

        manufactureNSObject.ISFACT = [attributeDict objectForKey:@"ISFACT"];
         manufactureNSObject.ISSKATE = [attributeDict objectForKey:@"ISSKATE"];
         manufactureNSObject.MANUFACTURER = [attributeDict objectForKey:@"MANUFACTURER"];
         manufactureNSObject.SKATERID = [attributeDict objectForKey:@"SKATERID"];

        NSLog(@"%@ %@ %@ %@", manufactureNSObject.ISFACT, manufactureNSObject.ISSKATE, manufactureNSObject.MANUFACTURER, manufactureNSObject.SKATERID);
    }    
} 

Мой NSLog печатает все правильные значения в порядке, следующая часть, на которой я застрял, это - parser:didEndElement:namespaceURI:qualifiedName: метод, ничего кроме didEndElement не проходит правильно ... это то, что я имею для этого метода.

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"%@", elementName);
    NSLog(@"%@", namespaceURI);
    NSLog(@"%@", qName);
}

Вот так выглядит мой вывод из NSLog s.

2011-10-13 10:04:16.529 Code[52605:207] F F GAZ 76
2011-10-13 10:04:16.531 Code[52605:207] Row
2011-10-13 10:04:16.535 Code[52605:207] (null)
2011-10-13 10:04:16.537 Code[52605:207] (null)
2011-10-13 10:04:16.537 Code[52605:207] F T MAN 38
2011-10-13 10:04:16.538 Code[52605:207] Row
2011-10-13 10:04:16.539 Code[52605:207] (null)
2011-10-13 10:04:16.540 Code[52605:207] (null)

Мне бы особенно хотелось помочь с завершением второго метода и заставить все это работать правильно.

Вся помощь до сих пор была высоко оценена.

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Для типа файла XML, который вы анализируете,

parser:foundCharacters:
никогда не вызывается. Этот метод делегата вызывается в таких случаях:
<mytag>this is the tag content</mytag>

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

<mytag attr1="value1" attr2="value2"></mytag>

Что касается другого метода:

parser:didEndElement:

его реализация зависит от вас. Например. если вы храните элемент во временной переменной, этот метод полезен для копирования этой переменной в другую структуру данных.

1 голос
/ 12 октября 2011

Создайте интерфейс NSMutableString, в который вы можете передать строку из parser:foundCharacters. Оттуда реализуйте подобную структуру, как вы это делали в parser:didStartElement: только в этот раз, вы будете использовать это NSMutableString и передадите его значение в объект, который представлен закрываемым элементом.

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

Просто если кто-нибудь проверит эту страницу в будущем, я узнал, как это сделать

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MANUFACTURER",cell.textLabel.text];
            NSArray *filterArray = [myDataArray filteredArrayUsingPredicate:predicate];
            [[self delegate] setManufactureSearchFields:filterArray withIndexPath:indexPath]; //This is where I pass the value back to the mainview

предикат ваш друг ... и они также хороши для выделения нужных значений из словаря ...

БУМ!

...