如何使用NSXMLParser将XML节点存储到NSArray中

时间:2012-04-20 08:12:27

标签: iphone objective-c nsxmlparser

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

<?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中,但我无法理解如何逐节点地解析它。这将非常有用。

2 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分: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];
}

您可以在类级别创建此数组并使用您想要的位置。

编辑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);
}