我正在开发一个使用XML输出的基于REST的API的项目。我们有多个对象具有对查询的标准格式XML响应。为了这个问题,让我们假设我们有用户和设备。用户响应的格式始终相同,但它们与设备响应不同。我想为每种查询类型编写自定义 didStartElement 和 didEndElement 函数。完成此任务的最佳方法是什么?我已经尝试创建一个新类作为NSXMLParserDelegate,但是当我尝试将它作为我的解析器的委托时,我遇到了错误。我可能做错了。感谢您的协助。
以下代码位于实际的ViewController页面
中 @Override
public String format(LogRecord record) {
StringBuffer sb = new StringBuffer();
sb.append("XXX "); // the XXX is just to see if this method ever got used
sb.append(this.formatMessage (record));
System.out.println("From GoTestFormater.format()");
return sb.toString();
}
}
我添加了一个像这样的新类页面:
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]){
//Do this for user response
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?){
//Do this for user response
}
func parser(parser: NSXMLParser, foundCharacters string: String){
//Do this for user response
}
func parserDidEndDocument(parser: NSXMLParser){
//Do this for user response
}
一个ViewController页面我试图像这样调用新的解析器类:
import UIKit
class Device_Parser: NSObject, NSXMLParserDelegate {
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]){
//Do this for device response
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?){
//Do this for device response
}
func parser(parser: NSXMLParser, foundCharacters string: String){
//Do this for device response
}
func parserDidEndDocument(parser: NSXMLParser){
//Do this for device response
}
}
在parser.delegate = Device_Parser上我收到以下错误:
无法将“Device_Parser.Type”类型的值指定为“NSXMLParserDelegate?”
是否可以让多个解析器委托以不同方式解析?我究竟做错了什么?我可以设置parser.delegate = self,但我不知道如何将委托设置为另一组 didStartElement 和 didEndElement 函数。对不起,如果这是菜鸟错误,还在学习Swift。
不是一个重复的问题我特意将此标记为Swift问题,并且建议的重复问题对我没有帮助。 Ole Begemann的解决方案正是我所寻找的并解决了我的问题。
答案 0 :(得分:1)
在这一行:
parser.delegate = Device_Parser
您正尝试将类指定为解析器的委托。您需要创建类的实例并使其成为委托。像这样:
let parser = NSXMLParser(data: data!)
let deviceParser = Device_Parser()
parser.delegate = deviceParser
parser.parse()
正如Arun Gupta所说,将部分代码移入Device_Parser
类本身可能是个好主意。