在Cocoa中解析XML

PF1*_*PF1 19 xml cocoa parsing objective-c

今天我正在研究如何在Cocoa中创建一个简单的XML解析器(用于桌面).我正在考虑使用NSXMLParser来解析数据,但我不确定从哪里开始.Web上的XML文件中没有太多数据,只是一个简单的列表,其中包含一些我需要保存到变量中的内容.有没有人对如何做到这一点有任何建议,因为有关这方面的在线文档没有太多意义.

谢谢你的帮助!

编辑我想要创建XML解析器的原因是从服务器上的MYSQL数据库获取信息到客户端应用程序.如果除了XML解析器之外还有更好的方法,请告诉我!

Dav*_*ong 50

以下是它的工作原理:

有一个名为NSXMLParser的类.它用于解析XML文件.但是,NSXMLParser是愚蠢的.所有它知道如何解析XML,但它不知道它应该对它找到的信息做什么.

输入代表.代表就像一个保姆.由于XMLParser不知道如何处理它找到的信息,它会向其代表询问每一件事:"嘿!我开始解析文档了!我应该做什么吗?" "嘿!我发现了一些CDATA!我该怎么办呢!" "嘿!我发现了另一个标签!" "嘿!我发现了一个结束标签!",依此类推.所有这些"嘿!" 语句是委托方法,换句话说,它们是委托对象可以选择实现的可选方法.通常(但并非总是),创建NSXMLParser的对象也是委托,但不一定是这种情况.

所以你可能有这样的事情:

NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:someURLToAnXMLFile];
[parser setDelegate:self];
[parser parse];
[parser release];
Run Code Online (Sandbox Code Playgroud)

然后在同一个对象(self)中,你可能有以下一些方法:

- (void)parserDidStartDocument:(NSXMLParser *)parser {
  //the parser started this document. what are you going to do?
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
  //the parser found an XML tag and is giving you some information about it
  //what are you going to do?
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
  //the parser found some characters inbetween an opening and closing tag
  //what are you going to do?
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
  //the parser finished. what are you going to do?
}
Run Code Online (Sandbox Code Playgroud)

文档中列出了大量这些方法.只需转到NSXMLParser类引用,它们都列在"委托方法"部分下.一旦掌握了它,NSXMLParser就非常容易使用.它是一个SAX Parser,这意味着它是事件驱动的解析器.它找到了东西,并告诉你它.

  • 我可能会同时使用两者.如果我需要一个客户端 - 服务器连接,并且我控制了两端,我可能会将数据保存在MySQL数据库中,然后使用一些PHP脚本访问它,这些脚本会抛出格式化为XML的适当数据(具体是Plist XML,所以我可以做像NSArray*myArray = [NSArray arrayWithContentsOfURL:urlToMyPHPScript];) (3认同)