我必须在一个 View 中解析两个 XML 文件,所以我使用两个 NSXMLParsers 来获取它。但问题是一个解析器被识别,而第二个解析器未被识别......我的意思是在调试器通过之后这行 [parser1 parse] 应该转到委托(delegate) didStartElement、foundcharacters 和 didEndElement,但在我的情况下,调试器没有输入这些委托(delegate)。它只是跳转到 [parser1 release] stmnt。所以这些委托(delegate)不会被 parser1 识别。是这样吗? 我写了这个:
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:Url];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
[parser release];
NSXMLParser *parser1 = [[NSXMLParser alloc] initWithContentsOfURL:Url1];
[parser1 setDelegate:self];
[parser1 setShouldProcessNamespaces:NO];
[parser1 setShouldReportNamespacePrefixes:NO];
[parser1 setShouldResolveExternalEntities:NO];
[parser1 parse];
[parser1 release];
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"TimeList"])
{
arr1=[[NSMutableArray alloc] init];
drr1=[[NSMutableDictionary alloc] init];
}
if([elementName isEqualToString:@"Company"])
{
drr1=[[NSMutableDictionary alloc] init];
}
srr1=[[NSMutableString alloc] init];
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[srr1 appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"ID"])
{
[drr1 setObject:srr1 forKey:@"ID"];
[srr1 release],srr1=nil;
return;
}
if([elementName isEqualToString:@"Company"])
{
[arr1 addObject:drr1];
}
if([elementName isEqualToString:@"TimeList"])
{
[drr1 release];
}
[srr1 release],srr1=nil;
}
- (void)parser1:(NSXMLParser *)parser1 didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"categorylist"])
{
arr2=[[NSMutableArray alloc] init];
drr2=[[NSMutableDictionary alloc] init];
}
if([elementName isEqualToString:@"lookup"])
{
drr2=[[NSMutableDictionary alloc] init];
}
srr2=[[NSMutableString alloc] init];
}
-(void)parser1:(NSXMLParser *)parser1 foundCharacters:(NSString *)string{
[srr2 appendString:string];
}
- (void)parser1:(NSXMLParser *)parser1 didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"Code"])
{
[drr2 setObject:srr2 forKey:@"Code"];
[srr2 release],srr2=nil;
return;
}
if([elementName isEqualToString:@"lookup"])
{
[arr2 addObject:drr2];
}
if([elementName isEqualToString:@"categorylist"])
{
[drr2 release];
}
[srr2 release],srr2=nil;
}
第一个解析器正在被识别并获取数据。但是对于第二个解析器 didStartElement 没有被识别...可能的原因是什么?
最佳答案
我自己解决了这个问题。实际上,我声明了一个字符串并向其传递了一些值。在解析它时进行检查,如果该条件为真,则它会解析.. 这就是我所做的:
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:Url];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
currentparser=@"1";
[parser parse];
[parser release];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:Url1];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
currentparser=@"2";
[parser parse];
[parser release];
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if(currentparser==@"1")
{
//do something
}
if(currentparser=@"2")
{
//do something
}
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if(currentparser==@"1")
{
//do something
}
if(currentparser=@"2")
{
//do something
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if(currentparser==@"1")
{
//do something
}
if(currentparser=@"2")
{
//do something
}
}
关于xcode4 - 单个 View xcode 中的许多 NSXMLParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12853810/