2013-02-22 91 views
0

我只是想分析從一個帖子迴應收到的字符串,我知道有像NSXMLParse的lib /類和蘋果提供了一些例子,但不是我想要的,或者我還沒有準備好了解該代碼。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'看起來像它將是您的示例的正確選擇。你有什麼困難呢? – 2013-02-22 14:56:41

+0

其實我不明白類的引用'https:// developer.apple.com/library/mac /#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html'我應該使用哪種方法知道在xml文件中有多少個?我需要知道循環所有這些,然後我如何告訴從標籤返回值? – rokimoki 2013-02-22 15:05:49

+1

'NSXMLParser'使用一種稱爲委派的模式。請參閱[此SO帖子](http://stackoverflow.com/a/1045854/620197)關於代表團。它被廣泛用於所有的iOS/Foundation/UIKit API。下面的答案很直接,應該直接回答你的問題。 – 2013-02-22 15:14:31

回答

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]'。 – 2013-02-22 15:17:32

+0

謝謝,我忘了它! – gladimdim 2013-02-22 15:22:17

+0

什麼是self.obj? – rokimoki 2013-02-22 15:41:57

0

以及上面的回答似乎完美的,但我會建議你使用一些其他的解析器如果您擁有大量數據和更快的處理速度,則可以使用TBXML,xml比較here