-1

http://wiki.cs.unh.edu/wiki/index.php/Parsing_XML_data_with_NSXMLParserで説明されている方法を使用して、Objective-C で XML パーサーを開発しようとしています。

フロー全体をコーディングしましたが、デリゲート コールバック メソッドが応答しません。

次のコードブロックを見て、間違い/エラーを見つけられるかどうか教えてください...

パーサーは以下から呼び出されています:

NSString* filePath = [[NSBundle mainBundle] pathForResource:@"cache" ofType:@"xml"];
NSLog(@"Path location is : %@",filePath);
NSData* xmlData = [NSData dataWithContentsOfFile:[NSURL URLWithString:filePath]];
NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlData];

if(nsXmlParser!=NULL)
{
     NSLog(@"parser is %@",nsXmlParser);
}

 HDDataXML *parser = [[HDDataXML alloc] initXMLParser];

[nsXmlParser setDelegate:parser];

BOOL success = [nsXmlParser parse];

// test the result
if (success)
{
    NSLog(@"No errors - effects count : i");
} else
{
    NSLog(@"Error parsing document!");
}

ここに表示されるのは、ドキュメントの解析エラーです! filePath変数は OK で、パーサーは null ではありません

ここで、デリゲートの .h ファイルで:

#import <Foundation/NSObject.h>
#import "EffectsCache.h"

@class EffectsCache;

@interface HDDataXML : NSObject<NSXMLParserDelegate>
{

  EffectsCache *effectsHandler;
  NSMutableString *currentElementValue;
  NSMutableArray *effects;
}

- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict;

 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string ;

- (void)parser:(NSXMLParser *)parser
  didEndElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
  qualifiedName:(NSString *)qName;

 - (HDDataXML *) initXMLParser;
  @property (nonatomic, retain) EffectsCache *effectsHandler;
  @property (nonatomic, retain) NSMutableArray *effects;
  @end

.m でのデリゲートの実装では、次のようになります。

 #import "HDDataXML.h"

@implementation HDDataXML
@synthesize effects, effectsHandler;

- (HDDataXML *) initXMLParser
{
    [super init];
    effects = [[NSMutableArray alloc] init];
    return self;
}
 - (void)parser:(NSXMLParser *)parser
 didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    NSLog(@"started parsing");

   if ([elementName isEqualToString:@"effects"]) {
       NSLog(@"effects element found – create a new instance of EffectsCache class...");
       effectsHandler = [[EffectsCache alloc] init];

    }
}

  - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
   {
      NSLog(@"mid parsing");
   if (!currentElementValue)
    {

       currentElementValue = [[NSMutableString alloc] initWithString:string];
    }
else
{
    [currentElementValue appendString:string];
}

   NSLog(@"Processing value for : %@", string);
}

 - (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{

  NSLog(@"done parsing");

 if ([elementName isEqualToString:@"effects"])
  {
       return;
   }

   if ([elementName isEqualToString:@"effect"])
  {
     [effectsHandler addObject:effects];
     [effectsHandler release];
      effectsHandler = nil;
   }  
  else
   {
      NSLog(@"cuurent value - %@",currentElementValue);
     [effects setValue:currentElementValue forKey:elementName];
   }

   [currentElementValue release];
   currentElementValue = nil;
 }

ポイントは、コールバック メソッドが機能していないことです。

バグを見つけるのを手伝ってください。

前もって感謝します。

4

2 に答える 2

0

わかりました...最終的に解決しました:

Martin R が提案したように、デリゲートを呼び出すためのコードを変更しました。

NSString* filePath = [[NSBundle mainBundle] pathForResource:@"effects_cache" ofType:@"xml"];
NSLog(@"Path location is : %@",filePath);
NSData* xmlData = [NSData dataWithContentsOfFile:filePath];
NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithData:xmlData];

この変更を行う前は、xmlDataは null でした。

もう 1 つの小さな変更が必要でした: change: [effectsHandler addObject:effects];

  [effects setValue:currentElementValue forKey:elementName];
于 2013-04-09T05:12:07.553 に答える
0
 nsXmlParser.delegate = self;
 [nsXmlParser parse];

.h ファイルで忘れずにdelegate

 <NSXMLParserDelegate>
于 2013-04-08T08:33:11.400 に答える