Intereting Posts
iOS CI – ошибка RestKit lcl_RK.h файл не найден Почему мой Xcode без опции «local local assets» AWSS3 Проблема конфигурации региона / plist 'Конфигурация сервиса – `nil` iOS Facebook SDK 3.2.1 Ошибка почтового сообщения Объектив-C для NSMutableDictionary не соблюдается в iOS10 Сбой устройства iOS по неизвестной причине xcode, ios, Невозможно перемещать кнопки вокруг экрана Приложение HTML5 офлайн всегда отправляет событие «ошибка» на iPod Touch iOS 4.2.1 Использование API Gmail с Xcode 7 и Swift Завершение приложения из-за неперехваченного исключения. Невозможно установить ограничение. Причина: нет общего представления между представлениями. найдено черное пространство сверху и снизу Xcode Как мне сэкономить много данных, когда данные не будут статичными. iOS, Cocoa Touch, Obj-C Метод делегирования Callback возвращает переменную slow, которая вызывает переменную nil при доступе к другому классу? iOS. Ищите текстовое поле и манипулируйте его тегом? Как я могу гарантировать, что регистрация для уведомления происходит в контроллере представления до того, как он сделалFinishLaunchingWithOptions?

Как я могу проанализировать XML-файл в Objective C

Я пытаюсь разобрать этот XML-файл . Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы использовать -(void)parser:(NSXMLParser*)parser didStartElement …, чтобы развернуть несколько уровней этого xml-файла.

Это то, что у меня есть до сих пор:

 #pragma didStartElement (from the parser protocol) - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { // Choose the tag if ([elementName isEqualToString:@"item"]) { NSString *firstName = [attributeDict valueForKey:@"firstname"]; NSString *lastName = [attributeDict valueForKey:@"lastname"]; NSString *birthDay = [attributeDict valueForKey:@"birthday"]; Politician *politician = [[Politician alloc] initWithName:firstName lName:lastName bDay:birthDay]; if (politician != nil) { [people addObject:politician]; } } } 

Проблема в том, что этот код не расширяется. Есть ли способ выборочно начать синтаксический анализ из определенного тега (скажем: человек) и проверить ключи этого тега или переписать значение «elementName», чтобы я мог использовать инструкции multipe if? Каков правильный способ сделать это? Большое спасибо.

Вы не смогли получить имя, фамилию и т. Д. В вашем атрибуте dict. Словарь атрибутов содержит значения, как в приведенном ниже формате

 <count n="1"> 

В приведенном выше примере атрибутDict содержит значение для n

Чтобы разобрать данный xml, вы можете использовать приведенный ниже код.

Объявлять объекты

 Politician *politician; NSString *curElement; NSMutableArray *politicians; BOOL isCongressNumbers; 

Инициализировать политиков в представленииDidLoad

 politicians = [[NSMutableArray alloc]init]; 

Добавить методы делегата

 #pragma mark - NSXMLParser Delegate - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"item"]) { politician = [[Politician alloc]init]; } else if ([elementName isEqualToString:@"congress_numbers"]) { isCongressNumbers = YES; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { curElement = string; } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"item"] && !isCongressNumbers) { [politicians addObject:politician]; } else if ([elementName isEqualToString:@"firstname"]) { politician.name = curElement; } else if ([elementName isEqualToString:@"lastname"]) { politician.lName = curElement; } else if ([elementName isEqualToString:@"birthday"]) { politician.bDay = curElement; } else if ([elementName isEqualToString:@"congress_numbers"]) { isCongressNumbers = NO; } } 

Ты можешь
1) новый политик в методе didStartElement и назначьте имя элемента в одной переменной экземпляра.

2) присваивать свойства политиков в найденных символах в соответствии с переменной экземпляра, назначенной в 1).

3) добавьте Политику к людям в didEndElement.

Надеюсь, это полезно.

Код примера выглядит следующим образом:

объявить некоторые переменные экземпляра:

 Politican *politican; NSString *currentElement; NSMutableArray *politicians; 

init массивы:

 politicians = [[NSMutableArray alloc] init]; 

реализовать методы делегата.

 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { currentElement = elementName; if ([elementName isEqualToString:@"item"]) { politician = [[Politician alloc] init]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if([string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].length<1) return; // avoid some white space if ([currentElement isEqualToString:@"firstname"]) { politician.firstname = string; } else if ([currentElement isEqualToString:@"lastname"]) { politician.lastname = string; } else if ([currentElement isEqualToString:@"birthday"]) { politician.birthday = string; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"item"]) { [politicians addObject:politician]; } } 

В любом случае, это всего лишь образец, лучше написать все инструкции if else в соответствии с вашим xml.

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

  In.h file @property (strong, nonatomic) NSXMLParser *xmlParser; @property (nonatomic, retain) NSMutableDictionary *lResponseDict; @property (nonatomic, weak) NSString *currentElement; NSString* UDID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; NSLog(@"UDID:: %@", UDID); NSString *urlString = [NSString stringWithFormat:@"urlHere"]; NSString *jsonString = [NSString stringWithFormat:LOGIN,self.cUsernameTxtFld.text,self.cPasswordTxtFld.text,UDID]; NSData *myJSONData =[jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; [request setValue:@"text/html" forHTTPHeaderField:@"Accept"]; NSMutableData *body = [NSMutableData data]; [body appendData:[NSData dataWithData:myJSONData]]; [request setHTTPBody:body]; NSError *error; NSURLResponse *response; NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSString *str = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; if(str.length > 0) { self.xmlParser = [[NSXMLParser alloc] initWithData:urlData]; self.xmlParser.delegate = self; // Start parsing. [self.xmlParser parse]; } #pragma mark - NSXML Parsar Delegate Methods. - (void)parserDidStartDocument:(NSXMLParser *)parser { // NSLog(@"Parsing Initiated."); } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { self.currentElement = elementName; if([elementName isEqualToString:@"data"]) { // NSLog(@"%@",elementName); self.lResponseDict = [[NSMutableDictionary alloc]init]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"data"]) { // NSLog(@"%@",elementName); NSLog(@"Final Dict: %@", _lResponseDict); } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { //NSLog(@"%@", string); [_lResponseDict setObject:string forKey:_currentElement]; } -(void)parserDidEndDocument:(NSXMLParser *)parser { } 

Надеюсь, что вы получаете данные URL … так что с SMXMLParser проще анализировать, используя один за другим узел …

В приведенном ниже примере я использую AFNetworking с SMXMLParser. Надеюсь, вы получите эту идею ….

  NSString *soapRequest=[NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" "<soap:Body>\n" // Your parameters here …. // "</soap:Body>\n" "</soap:Envelope>\n"]; NSString *urlStr = @"Your URL"; NSURL *urlNew = [NSURL URLWithString:urlStr]; NSMutableURLRequest *request=[appDel generateRequestWithUrl:urlNew request:soapRequest]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSError *error=nil; dictCarList = [[NSMutableDictionary alloc]init]; SMXMLDocument *document=[[SMXMLDocument alloc]initWithData:operation.responseData error:&error]; if (error) { NSLog(@"Error while parsing the document: %@", error); [indicatorView removeFromSuperview]; return; } count++; SMXMLElement *element1 = [document.root childNamed:@"objects"]; SMXMLElement *element2 = [element1 childNamed:@"The Tag you want to get"]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error:%@",error); }];