2015-04-29 6 views
-1

Вот часть моего URLSwift разбор имя атрибута для данного ELEMENTNAME

<cities> 
    <country name="Абхазия"> 
    <city id="37188" region="27028" head="" type="3" country="Абхазия" part="" resort="" climate="">Новый Афон</city> 
    <city id="37178" region="10282" head="" type="3" country="Абхазия" part="" resort="" climate="">Пицунда</city> 
    <city id="37187" region="37187" head="" type="3" country="Абхазия" part="" resort="" climate="">Гудаута</city> 
    <city id="37172" region="10280" head="" type="3" country="Абхазия" part="" resort="" climate="">Гагра</city> 
    <city id="37189" region="10281" head="0" type="3" country="Абхазия" part="" resort="0" climate="">Сухум</city> 
    </country> 

пользователь печатает имя города, например: "Пицунда" и я хочу, чтобы получить его идентификатор. Для "Пицунда" id - "10282".

Ниже я опубликовал свой нерабочий код.

var parser: NSXMLParser! 
var city: String = String() 
var ifDirOK = false 
var ifCityNameOK = false 


override func viewDidLoad() { 
    super.viewDidLoad() 

    let url: NSURL = NSURL(string: "https://pogoda.yandex.ru/static/cities.xml")! 

    parser = NSXMLParser(contentsOfURL: url) 
    parser.delegate = self 
    parser.parse() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 



func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) { 
    //let cityID = attributeDict ["id"] as? NSString 
    if (elementName == "city"){ 
     ifDirOK = true 
    } 
} 

func parser(parser: NSXMLParser!, foundCharacters string: String!) { 
    var data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 
    if (data == city){ 
     ifCityNameOK = true 
    } 
} 

func parser(parser: NSXMLParser!, foundAttributeDeclarationWithName attributeName: String!, forElement elementName: String!, type: String!, defaultValue: String!) { 
    if (ifDirOK && ifCityNameOK){ 
     println("\(attributeName)") 
    } 
} 

func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { 
} 

В конце концов, я хочу передать идентификатор другому URL файла (export.yandex.ru/weather-ng/forecasts/{id of the city}.xml) и разобрать его. Нужно ли мне создать еще один класс Swift и каким-то образом связать его с первым?

+0

Непонятно, что вы спрашиваете - как насчет вашего кода не работает, или это то, что вы ищете подсказки, чтобы сделать что-то отличное от того, что он сейчас делает? –

ответ

0

Создание словаря [city: id] может быть для вас решением. Я внедрил простое решение, основанное на статье о жизненном цикле NSXMLParser по адресу http://www.codeproject.com/Articles/248883/Objective-C-Fundamentals-NSXMLParser.

Вызывается следующий метод, когда начинается запуск элемента. Вы можете получить атрибут id города и сохранить его в переменной уровня экземпляра, чтобы вы могли использовать его в следующем методе.

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) 

И затем, вызывается следующий метод, когда парсер видит что-либо между началом и окончанием.

func parser(parser: NSXMLParser!, foundCharacters string: String!) 

Итак, вы можете получить название города отсюда. Теперь у нас есть идентификатор города и название города, чтобы добавить новый элемент в словарь [city: id].

Как только вы создадите словарь, поиск будет очень простым.

вот мой рабочий тестовый код.

class ViewController: UIViewController ,NSXMLParserDelegate{ 
    var parser: NSXMLParser! 
    var city: String = String() 
    var ifDirOK = false 
    var ifCityNameOK = false 
    var element : String? 
    var value: String=String() 
    var dic = Dictionary<String,String>() 
    var currentCityId:String? 
    @IBOutlet weak var result: UILabel! 

    @IBOutlet weak var search: UITextField! //search text 

    @IBAction func ActionGoGetIt(sender: AnyObject) { 

     self.result.text=dic[self.search.text] 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let url: NSURL = NSURL(string: "https://pogoda.yandex.ru/static/cities.xml")! 

     parser = NSXMLParser(contentsOfURL: url) 
     parser.delegate = self 
     parser.parse() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) { 
     element = elementName 

     if (element == "city"){ 
      ifDirOK = true 
      let cityID = attributeDict ["id"] as? NSString 
      self.currentCityId = cityID as? String 

     } 
    } 

    func parser(parser: NSXMLParser!, foundCharacters string: String!) { 
     var data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 

     if (!data.isEmpty){ 
      if (element == "city"){ 
        dic[data] = self.currentCityId as String? 
      } 

     } 
    } 

    func parser(parser: NSXMLParser, foundAttributeDeclarationWithName attributeName: String, forElement elementName: String, type: String?, defaultValue: String?) { 
     if (ifDirOK && ifCityNameOK){ 
      println("\(attributeName)") 
     } 
    } 

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 

    } 

} 
+0

Большое спасибо. Он отлично работает! – Koka

 Смежные вопросы

  • Нет связанных вопросов^_^