Swift:拥有多个NSXMLPasrser代表的最佳方法是什么?

时间:2016-04-02 04:46:59

标签: xml swift

我正在开发一个使用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的解决方案正是我所寻找的并解决了我的问题。

1 个答案:

答案 0 :(得分:1)

在这一行:

parser.delegate = Device_Parser

您正尝试将指定为解析器的委托。您需要创建类的实例并使其成为委托。像这样:

let parser = NSXMLParser(data: data!)
let deviceParser = Device_Parser()
parser.delegate = deviceParser
parser.parse()

正如Arun Gupta所说,将部分代码移入Device_Parser类本身可能是个好主意。