Перестал работать XML парсер

Рейтинг: 0Ответов: 1Опубликовано: 21.04.2015

Здравcтвуйте, после перехода на Xcode 6.3 перестал работать xml парсер. А именно не вызываются методы делегата. Буду признателен за помощь.

Вот мой код:

Данные которые нужно распарсить:

var strData:String = "<?xml version='1.0' encoding='UTF-8'?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"

let parser = XMLParser(xml: strData , element:"body") //Xml и что искать
parser.parse()
var value = parser.returnValue! //Значение содержащиеся в теге <body>, сейчас возвращается nil

Вот сам класс который занимается парсингом:

import Foundation

private class ParserDelegate:NSObject, NSXMLParserDelegate{

var text=""
var element:String
var recordingElementValue:Bool=false

init(element:String){
    self.element=element

    super.init()
}


//Эти методы не вызываются вообще
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]) {
    println("element start: \(elementName)")
    if elementName==element{
        recordingElementValue=true
    }
 }

func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) {
    println("element finish: \(elementName)")
    if elementName==element{
        recordingElementValue=false
    }
}

func parser(parser: NSXMLParser!, foundCharacters string: String!) {
      if recordingElementValue{
          text+=string
          println("Text\(text)")
      }
   }

}


class XMLParser{
   private var xmlString:String
   var returnValue:String!
   private var parserDelegate:ParserDelegate

   init(xml:String, element:String){
      self.xmlString = xml
      self.parserDelegate = ParserDelegate(element:element)
    }




func parse()->Bool{
    let p = NSXMLParser(data: xmlString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)
      p.delegate = parserDelegate
      if p.parse(){
        returnValue = parserDelegate.text
        println(p.parserError)
        return true
      }
      return false
   }

}

Ответы

▲ 2

Вызов парсера

let ratesParser = ExchangeRateParser()
let rates = ratesParser.getRates()

Сам парсер

ExchangeRateParser.swift

import Foundation

let kURLString : String = "http://www.cbr.ru/scripts/XML_daily.asp"

public let kValCurs : String = "ValCurs"
public let kDate : String = "Date"
public let kID : String = "ID"
public let kValute : String = "Valute"
public let kNumCode : String = "NumCode"
public let kCharCode : String = "CharCode"
public let kNominal : String = "Nominal"
public let kName : String = "Name"
public let kValue : String = "Value"

public class ExchangeRateParser: NSObject, NSXMLParserDelegate {
    
    // MARK - vars
    
    var items : [Dictionary<String, String>] = []
    
    private var date : String = ""
    private var numCode : String = ""
    private var charCode : String = ""
    private var nominal : String = ""
    private var name : String = ""
    private var value : String = ""
    private var currentElement : String = ""

    // MARK - func
    
    public func getRates() -> [Dictionary<String, String>] {
        let url : NSURL = NSURL(string: kURLString)!
        
        if let parser = NSXMLParser(contentsOfURL: url) {
            parser.delegate = self
            parser.parse()
        }
        return items
    }
    
    // MARK - NSXMLParser delegate
    
    public func parserDidStartDocument(parser: NSXMLParser!) {
    }
    
    public func parserDidEndDocument(parser: NSXMLParser!) {
    }
    
    public func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) {
        
        if let  attributes = attributeDict as? Dictionary<String, AnyObject> {
            if let  attributeDate = attributes[kDate] as? String {
                date = attributeDate
            }
        }
        
        if let element = elementName {
            currentElement = element
            
            if element == kValute {
                numCode  = ""
                charCode = ""
                nominal  = ""
                name     = ""
                value    = ""
            }
        }
    }
  public   
    func parser(parser: NSXMLParser!, foundCharacters string: String!) {
        
        if currentElement == kNumCode {
            numCode = numCode + string.condenseWhitespace()
        }
        else if currentElement == kCharCode {
            charCode = charCode + string.condenseWhitespace()
        }
        else if currentElement == kNominal {
            nominal = nominal + string.condenseWhitespace()
        }
        else if currentElement == kName {
            name = name + string.condenseWhitespace()
        }
        else if currentElement == kValue {
            value = value + string.condenseWhitespace()
        }
    }
  public   
    func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) {
        
        if let element = elementName {
            if element == kValute {
                let item = [kNumCode:numCode, kCharCode:charCode, kNominal:nominal, kName:name, kValue:value, kDate: date]
                items.append(item)
            }
        }
    }
}