解析进展顺利。但是我无法在“Book”类的'aBook'对象中获得价值(而aBook具有Book类的所有属性,如'id','iid','catname','subcatname','url'i.e声明并保留)。怎样做在aBook中获取值?
这是gdb输出:
2011-04-28 15:08:12.046 XML[7053:20b] Processing Element: Table 2011-04-28 15:08:12.047 XML[7053:20b] Processing Value: 2011-04-28 15:08:12.048 XML[7053:20b] Processing Element: id 2011-04-28 15:08:12.048 XML[7053:20b] Processing Value: 1 2011-04-28 15:08:12.049 XML[7053:20b] Processing Value: 2011-04-28 15:08:12.050 XML[7053:20b] Processing Element: catname 2011-04-28 15:08:12.050 XML[7053:20b] Processing Value: Birthday 2011-04-28 15:08:12.051 XML[7053:20b] Processing Value: 2011-04-28 15:08:12.051 XML[7053:20b] Processing Element: iid 2011-04-28 15:08:12.051 XML[7053:20b] Processing Value: 1 2011-04-28 15:08:12.052 XML[7053:20b] Processing Value: 2011-04-28 15:08:12.052 XML[7053:20b] Processing Element: subcatname 2011-04-28 15:08:12.052 XML[7053:20b] Processing Value: card1 2011-04-28 15:08:12.053 XML[7053:20b] Processing Value: 2011-04-28 15:08:12.053 XML[7053:20b] Processing Element: url 2011-04-28 15:08:12.053 XML[7053:20b] Processing Value: http://www.orkutpapa.com/scraps/happy-birthday-card-2-3.jpg 2011-04-28 15:08:12.054 XML[7053:20b] Processing Value:
这里是我的代码:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"NewDataSet"]) { //Initialize the array. appDelegate.books = [[NSMutableArray alloc] init]; } else if([elementName isEqualToString:@"Table"]) { aBook = [[Book alloc] init]; } NSLog(@"Processing Element: %@", elementName); } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(!currentElementValue) currentElementValue = [[NSMutableString alloc] initWithString:string]; else [currentElementValue appendString:string]; NSLog(@"Processing Value: %@", currentElementValue); } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"Table"]) { [appDelegate.books addObject:aBook]; [aBook release]; aBook = nil; } else if([elementName isEqualToString:@"catname"]) { [aBook setValue:currentElementValue forKey:@"catname"]; NSLog(@"elementName for catname....%@",currentElementValue); NSLog(@"aBook for catname....%@",aBook); } else if([elementName isEqualToString:@"subcatname"]) { [aBook setValue:currentElementValue forKey:@"subcatname"]; NSLog(@"elementName for catname....%@",currentElementValue); NSLog(@"aBook for catname....%@",aBook); } else if ([elementName isEqualToString:@"url"]) { [aBook setValue:currentElementValue forKey:@"url"]; // [aBook setValue:currentElementValue forKey:elementName]; NSLog(@"elementName for url....%@",currentElementValue); NSLog(@"aBook for url....%@",aBook); } [currentElementValue release]; currentElementValue = nil; }
答案 0 :(得分:0)
以下是我将使用的xml代码:
<?xml version="1.0"?>
<elements>
<element id="1" catname="Birthday" iid="1" subcatname="card1" url="http://www.orkutpapa.com/scraps/happy-birthday-card-2-3.jpg" />
</elements>
使用上面的XML格式,'elements'包含所有xml记录。 'element'表示具有以下变量的一条记录:id,catname,iid,subcatname和url。您可以根据自己的喜好更改这些,但请注意这些变量名称。这是解析时调用数据的方法。
你需要在某处制作NSURLConnection。例如,这可以响应UITouch或放在viewWillAppear中。我将假设您知道如何建立此连接,但它应包含以下方法:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
此方法应重置数据,因为收到的回复不完整。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
此方法是您可以将数据附加到NSMutableData
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
这应该处理错误,释放连接并释放NSMutableData。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
此方法应调用startParsingData并释放连接。
现在您可能感兴趣的部分(对不起,如果您知道上面的NSURLConnection参考),如何解析数据:
- (void)startParsingData
{
NSXMLParser *myDataParser = [[NSXMLParser alloc] initWithData:receivedFriendData];
myDataParser.delegate = self;
[myDataParser parse];
[myDataParser release];
[myNSMutableData release];
}
在此方法中,您应该初始化数据解析器并分配委托。确保将NSXMLParserDelegate协议分配给您的类。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"element"])
{
NSString *url = [NSString stringWithFormat:@"%@", [attributeDict objectForKey:@"url"]];
// Now do with your URL as you please =)
}
}
请注意,attributeDict调用objectForKey。此键应与要调用和使用的xml文件中的变量名匹配。另请注意,elementName('element')与xml文件中的记录名称匹配。
如果有帮助或者您有任何其他问题,请告诉我们!
干杯, 埃文
答案 1 :(得分:0)