2013-02-22 3 views
0

Я просто хочу проанализировать строку, полученную от ответа на сообщение, я знаю, что существуют lib/classes, такие как NSXMLParse, и apple предоставляет некоторый пример, но не то, что я хочу, или я не готов понять этот код.XML-анализ с помощью объектно-кода C

Я получаю это:

<object> 
<id>1</id> 
<alias>juan</alias> 
<email>[email protected]</email> 
</object> 
<object> 
<id>2</id> 
<alias>juana</alias> 
<email>[email protected]</email> 
</object> 

Тогда мне нужно разобрать, и получить данные, как это:

NSString *xmlThing = [response]; 
for xmlThing in-all <object> 
{ 
    uint id = <id>1</id> 
    NSString *alias = <alias>juan</alias> 
    NSString *email = <email>[email protected]</email> 
} 

Почему так? потому что я думаю, что это самый простой способ сделать и проанализировать все типы html, xml и т. д. файлов.

Я ценю все виды помощи.

+5

'NSXMLParser' выглядит так, как будто это будет правильный выбор для вашего примера. С какой частью вы испытываете затруднения? –

+0

На самом деле я не понимаю ссылку на класс 'https: // developers.apple.com/library/mac/# documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html', какой метод я должен использовать для знаете, сколько находятся в файле xml? Мне нужно знать, чтобы все их петли, и как я скажу, чтобы вернуть значение с метки ? – rokimoki

+1

'NSXMLParser' использует шаблон, называемый делегированием. См. [This SO post] (http://stackoverflow.com/a/1045854/620197) о делегировании. Он широко используется во всех API-интерфейсах iOS/Foundation/UIKit. Ответ ниже прямолинейный и должен ответить на ваш вопрос напрямую. –

ответ

4

Вы можете использовать NSXMLParser и его методы делегирования.

Пример: В * .h файле добавить NSXMLDelegate:

@interface YourClass: NSObject <NSXMLParserDelegate> 

* .m файл:

@interface YourClass() 
    @property NSMutableString *currentXMLValue; 
    @property NSMutableArray *objects; 
    @end 

    @implementation YourClass{ 
    -(void) processXML { 
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData: data]; 
    self.objects = [[NSMutableArray alloc] init]; 
    [xmlParser setDelegate: self]; 
    [xmlParser parse]; 
    } 

    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    { 
     //each time part of string is found append it to current string 
     [self.currentXMLValue appendString:string]; 
    } 

//here you can check when <object> appears in xml and create this object 
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName 
    attributes: (NSDictionary *)attributeDict 
{ 
    //each time new element is found reset string 
    self.currentXMLValue = [[NSMutableString alloc] init]; 
    if([elementName isEqualToString:@"object"]) 
    { 
     self.obj= [[YourObject alloc] init]; 
    } 
} 
//this is triggered when there is closing tag </object>, </alias> and so on. Use it to set object's properties. If you get </object> - add object to array. 
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    { 

     if ([elementName isEqualToString:@"id"]) { 
      obj.id = [self.currentXMLValue intValue]; 
     } 
     else if ([elementName isEqualToString:@"alias"]) { 
      obj.alias = self.currentXMLValue; 
     } 
     else if ([elementName isEqualToString:@"object"]) { 
     if (self.objects) { 
      [self.object addObject:obj]; 
     } 
     } 
    //and so on 
    } 
    } 
+2

И в какой-то момент вы должны вызвать '[xmlParser parse]'. –

+0

Спасибо, я забыл об этом! – gladimdim

+0

что такое self.obj? – rokimoki

0

хорошо представленная выше, кажется идеальным, но я бы посоветовал вам использовать какой-то другой анализатор, если у вас большой объем данных и более высокая скорость обработки, вы, вероятно, можете использовать TBXML, сравнение xml here

Смежные вопросы