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 协议 - 在Apple 文档中,它将委托设置为自身,而不是 XMLParser 什么都不做,在其他示例中,委托实现了它需要的那些方法。

请参阅SeismicXML 示例

委托被声明为 @interface ParseOperation () <NSXMLParserDelegate>并实现了 NSXMLParserDelegate 中的一些方法

所以在你的情况下,你需要@interface XMLParser () <NSXMLParserDelegate>并实现你想要的方法。

于 2012-07-09T13:51:06.870 回答