我无法完全理解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中,但我无法理解如何逐节点地解析它。这将非常有用。
答案 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);
}