我正在创建一个mac应用程序,我需要它来解析本地xml文件并将其显示到tableView中。出于某种原因,我在tableView中得到一个空白行,这没有任何意义,因为它找到了我的xml中的字符。这是我的代码:
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"found file and started parsing");
}
- (void)parseXMLFileAtURL:(NSString *)URL
{
//you must then convert the path to a proper NSURL or it won't work
NSURL *xmlURL = [NSURL URLWithString:URL];
// here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error
// this may be necessary only for the toolchain
rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[rssParser setDelegate: self];
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];
[rssParser parse];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString * errorString = [NSString stringWithFormat:@"Unable to download XML feed (Error code %i )", [parseError code]];
NSLog(@"Error parsing XML: %@", errorString);
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//NSLog(@"found this element: %@", elementName);
currentElement = [elementName copy];
if ([elementName isEqualToString:@"event"]) {
// clear out our story item caches...
item = [[NSMutableDictionary alloc] init];
date = [[NSMutableString alloc] init];
opponent = [[NSMutableString alloc] init];
location = [[NSMutableString alloc] init];
time = [[NSMutableString alloc] init];
games = [[NSMutableString alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"ended element: %@", elementName);
if ([elementName isEqualToString:@"event"]) {
// save values to an item, then store that item into the array...
[item setObject:date forKey:@"date"];
[item setObject:opponent forKey:@"opponent"];
[item setObject:location forKey:@"location"];
[item setObject:time forKey:@"time"];
[item setObject:games forKey:@"games"];
NSMutableArray *stories = [[NSMutableArray alloc] init];
[stories addObject:[item copy]];
[arrayController addObject:[NSDictionary dictionaryWithObjectsAndKeys:
date, @"date",
opponent, @"opponent",
location, @"location",
time, @"time",
games, @"games"
, nil]];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//NSLog(@"found characters: %@", string);
// save the characters for the current item...
if ([date isEqualToString:@"date"]) {
[date appendString:string];
} else if ([opponent isEqualToString:@"opponent"]) {
[opponent appendString:string];
} else if ([location isEqualToString:@"location"]) {
[location appendString:string];
} else if ([time isEqualToString:@"time"]) {
[time appendString:string];
} else if ([games isEqualToString:@"games"]) {
[games appendString:string];
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"all done!");
[tabelview reloadData];
}
当我删除我的添加部分时,它将项目添加到arraycontroller,并添加
[arrayController addObject:stories];
我得到了('s
如果您还需要其他任何内容,请不要只是投票,而是告诉我。谢谢!
这是我的xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmlData>
<event>
<date>date here</date>
<opponent>opponent here</opponent>
<location>location here</location>
<time>time here</time>
<games>games here</games>
</event>
<event>
<date>date here</date>
<opponent>opponent here</opponent>
<location>location here</location>
<time>time here</time>
<games>games here</games>
</event>
<event>
<date>date here</date>
<opponent>opponent here</opponent>
<location>location here</location>
<time>time here</time>
<games>games here</games>
</event>
<event>
<date>date here</date>
<opponent>opponent here</opponent>
<location>location here</location>
<time>time here</time>
<games>games here</games>
</event>
</xmlData>
答案 0 :(得分:1)
错误在您的解析器中。请修改逻辑。填充表视图数组时,您没有使用对象item
。此外,您没有捕获XML元素之间的文本,也没有将它们分配给适当的变量。
请注意以下事项:
event
元素后,您应该将item
及其所有填充的密钥添加到数据数组中。答案 1 :(得分:0)
您需要知道如何使用数组。您正在分配一个阵列故事。但后来没有使用。请检查你的didEndElement方法。
创建一个Event类,创建.h和.m文件,然后创建all元素的属性,然后将 Event 类的整个对象添加到数组中。您可以在appHandler或Single ton类中使用该数组。
检查这件事。可以帮到你。