2012-04-20 146 views
0

我无法完全理解NSXMLParser的流程以及与它们关联的委托方法。是否有任何方法或任何示例,详细说明如何使用NSXMLParser完成分析。我有另一个XML,我需要在解析XMl后将相关的qno,tin,tout和answer存储到相应的字符串中。 PFB XML。如何使用NSXMLParser将XML的节点存储到NSArray中

<?xml version="1.0" encoding="UTF-8"?> 
<ParticipantService> 
    <Response> 
     <FileName>CustomerSkillsIntro</FileName> 
     <playlist> 
      <question answer="t" qno="1" tin="71" title="Greet" tout="73"/> 
      <question answer="t" qno="2" tin="74" title="Have Name Tag" tout="77"/> 
      <question answer="t" qno="3" tin="78" title="Greet" tout="83"/> 
      <question answer="t" qno="4" tin="109" title="Helping Do My Job" tout="112"/> 
      <question answer="t" qno="5" tin="131" title="Greet Happily" tout="134"/> 
      <question answer="t" qno="6" tin="141" title="Stay cheerful when resident is crabby" tout="144"/> 
      <question answer="t" qno="7" tin="151" title="Bond with the new resident" tout="154"/> 
      <question answer="t" qno="8" tin="161" title="Welcome cheerfully" tout="164"/> 
      <question answer="t" qno="9" tin="169" title="Offer Help" tout="172"/> 
      <question answer="t" qno="10" tin="178" title="Help with interest" tout="181"/> 
      <question answer="t" qno="11" tin="183" title="Accompany" tout="186"/> 
      <question answer="t" qno="12" tin="189" title="Pay attention to 2 resudents" tout="192"/> 
      <question answer="t" qno="13" tin="199" title="Juggle the two accurately" tout="202"/> 
      <question answer="t" qno="14" tin="207" title="Bring in other help when needed" tout="212"/> 
      <question answer="t" qno="15" tin="219" title="Correct response I can ask" tout="222"/> 
      <question answer="t" qno="16" tin="231" title="Be charming" tout="237"/> 
      <question answer="t" qno="17" tin="247" title="Respond and delegate" tout="250"/> 
      <question answer="t" qno="18" tin="261" title="Apologize" tout="263"/> 
      <question answer="t" qno="19" tin="266" title="Offer activities" tout="270"/> 
      <question answer="t" qno="20" tin="273" title="Be sensitive to needs" tout="276"/> 
      <question answer="t" qno="21" tin="287" title="Offer anything you need" tout="290"/> 
      <question answer="t" qno="22" tin="311" title="Take off shoes, honor unusual request" tout="315"/> 
      <question answer="t" qno="23" tin="328" title="Always available menu explained" tout="331"/> 
      <question answer="t" qno="24" tin="333" title="Willing to stay beyond shift" tout="336"/> 
      <question answer="t" qno="25" tin="377" title="Explain policy" tout="380"/> 
      <question answer="t" qno="26" tin="390" title="Understand resident" tout="396"/> 
     </playlist> 
     <path>lmsstaging.2xprime.com</path> 
     <EncodedVideoURL>HTTP://lmsstaging.2xprime.com/test/vdos/Alzheimers.mp4</EncodedVideoURL> 
    </Response> 
    <RequestStatus> 
     <Code>1</Code> 
     <Status>SUCCESS</Status> 
     <Message/> 
    </RequestStatus> 
</ParticipantService> 

是否有人可以解释我如何解析这个XML和有关的NSXMLParser和委托方法的工作原理的详细说明?我想将“tin”和“tout”存储到NSArray中,但我无法理解如何逐个解析节点。这将非常有帮助。

+0

感谢@Jennis用于格式化代码。我在如何发布确切的XML方面遇到困难。 – 2012-04-20 08:37:20

+0

您好:D – 2012-04-20 08:57:50

回答

1

夫妇的委托方法都存在于NSXML Parser-

-(BOOL) parse:(NSData *)xmlData 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 

您可以使用方法后面的代码行,你的情况didStartElement-

if([elementName isEqualToString:@"question"]) { 
    NSString *answer = [attributeDict valueForKey:@"answer"]; 
    NSString *qno = [attributeDict valueForKey:@"qno"]; 
    NSString *tin = [attributeDict valueForKey:@"tin"]; 
    NSString *title = [attributeDict valueForKey:@"title"]; 

    // Now You can store these in your preferable data models - data objects/array/dictionary 
} 

编辑 -

@interface Question : NSObject 

@property (nonatomic, retain) NSString *answer; 
@property (nonatomic, retain) NSString *qno; 
@property (nonatomic, retain) NSString *tin; 
@property (nonatomic, retain) NSString *title; 

@end 

@implementation Question 

@synthesize answer = _answer; 
@synthesize qno = _qno; 
@synthesize tin = _tin; 
@synthesize title = _title; 

- (void) dealloc { 
    self.answer = nil; 
    self.qno = nil; 
    self.tin = nil; 
    self.title = nil; 

    [super dealloc];   
} 
@end 

现在在您的didStartElement方法中 -

NSMutableArray *questionsArray = [NSMutableArray array]; 
if([elementName isEqualToString:@"question"]) { 
    Question *questionObject = [[Question alloc] init]; 
    questionObject.answer = [attributeDict valueForKey:@"answer"]; 
    questionObject.answerqno = [attributeDict valueForKey:@"qno"]; 
    questionObject.answertin = [attributeDict valueForKey:@"tin"]; 
    questionObject.answertitle = [attributeDict valueForKey:@"title"]; 

    [questionsArray addObject:questionObject]; 
    [questionObject release]; 
} 

您可以在课堂级别创建此数组,并在需要的地方使用。

EDIT 2 - 向从阵列 -

//Suppose dataArray contains information - 
for (int i = 0; i < [dataArray count]; i++) { 
    Question *obj = [dataArray objectAtIndex:i]; 
    NSLog(@"%@",obj.answer); 
    NSLog(@"%@",obj.qno); 
    NSLog(@"%@",obj.tin); 
    NSLog(@"%@",obj.title); 
} 
+0

'didEndElement'没有'attributeDict'参数 – MrTJ 2012-04-20 08:33:15

+1

对不起,它是didStartElement。 – rishi 2012-04-20 08:49:07

+0

@RIP:在我的例子中,我有26个问题。如何存储特定于某个问题的所有值?我的意思是我对每个问题没有不同的价值观。我如何存储每个值,单独区分问题否? – 2012-04-20 09:13:36

2
NSXMLParser

是所谓基于事件的XML解析器SAX type解析器提取数据。它从头开始读取您的XML,每次它找到一个新元素,一个关闭元素或字符数据时,它会通知您。这是通过委托完成的,如果这些事件通过实现回调函数发生,你必须指定你想要做什么。当您解析示例XML,它会调用或多或少这些功能:

parser:yourParser didStartElement:@"playlist" namespaceURI:@"" qualifiedName:@"" attributes:attribDict 
// attribDict empty 

parser:yourParser didStartElement:@"question" namespaceURI:@"" qualifiedName:@"" attributes:attribDict 
// attribDict = {@"answer" -> @"t", @"qno" -> @"2", @"tin" -> @"71", @"title" -> @"Greet", @"tout" -> @"73"} 

parser:yourParser didEndElement:@"question" namespaceURI:@"" qualifiedName:@"" 

// ...repeating the last two calls for each question... 

parser:yourParser didEndElement:@"playlist" namespaceURI:@"" qualifiedName:@"" 

所以,你应该实现didStartElement是这样的:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    if (elementName == @"question") { 
    // save the elements of attributeDict in your array 
    } 
} 
相关问题