1

私はココアで作業しています.xmlファイルを解析したいです。
しかし、ここの私のコードには2つの警告があります

incompatible Objective-C types 'struct NSString *', expected 'struct NSURL *' when passing argument 1 of 'initWithContentsOfURL:' from distinct Objective-C typeclass 'XMLParser' does not implement the 'NSXMLParserDelegate' protocol

これは私のコードです:

int main(int argc, char *argv[])
{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSData *data = [[NSData alloc] initWithContentsOfURL:@"/Users.xml"]; // here is the first warning
    // create and init NSXMLParser object
    NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithData:data];

    // create and init our delegate
    XMLParser *parser = [[XMLParser alloc] initXMLParser];

    // set delegate
    [nsXmlParser setDelegate:parser]; // here is the second warning

    // parsing...
    BOOL success = [nsXmlParser parse];

    // test the result
    if (success) {
        NSLog(@"No errors");// - user count : %i", [parser [users count]]);
        // get array of users here
        //  NSMutableArray *users = [parser users];
    } else {
        NSLog(@"Error parsing document!");
    }

    [parser release];
    [nsXmlParser release];
    [pool drain];

    return NSApplicationMain(argc,  (const char **) argv);
}

どうすればこれを解決できますか? を実行すると、プログラムがシグナル SIGABRT を受信し、動作しないことが通知されます

4

2 に答える 2

0

さて、NSURL クラスがあります...警告が示すように、これらのいずれかを渡す必要があります。

また、パーサーのデリゲートをパーサー自体に設定しないでください。デリゲートが必要ない場合は、設定しないでください。デリゲートはコールバックに使用されるため、アプリケーションは解析中に操作を行うことができます。

于 2012-07-09T13:50:43.950 に答える
0

initWithContentsOfURL:ファイル名ではなくパラメーターとしてNSURLが必要なので、ファイル名から作成する必要があります。

NSURL* url = [NSURL fileURLWithPath:@"/Users.xml"];

NSdata は必要ないので、直接行ってください

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL fileURLWithPath:@"/Users.xml"]];

デリゲートを設定すると、デリゲート先のオブジェクトを実装する必要があり、それは NSXMLParserDelegate プロトコルを実装すると言います

SeismicXMLの例を見る

デリゲートは次のように宣言され @interface ParseOperation () <NSXMLParserDelegate>、NSXMLParserDelegate のいくつかのメソッドを実装します。

したがって、あなたの場合、必要な@interface XMLParser () <NSXMLParserDelegate>メソッドを必要とし、実装します。

于 2012-07-09T13:51:06.870 に答える