XML解析的目标C代码

问题描述:

我只是想分析从一个帖子回应收到的字符串,我知道有像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://*.com/a/1045854/620197)关于代表团。它被广泛用于所有的iOS/Foundation/UIKit API。下面的答案很直接,应该直接回答你的问题。 – 2013-02-22 15:14:31

您可以使用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

以及上面的回答似乎完美的,但我会建议你使用一些其他的解析器如果您拥有大量数据和更快的处理速度,则可以使用TBXML,xml比较here

您可以使用XMLReader类来毫不费力地解析XML文件。 对于更详细的结账https://appengineer.in/2013/08/03/xml-parsing-using-xml-reader-in-objective-c/