2016-10-17 2 views
0

Вот проблема, которую я пытаюсь разобрать XML в Swift, все работает, за исключением значений.Переменная недоступна вне функции Swift

import UIKit 


class ItemParser: NSObject, XMLParserDelegate { 
var parser = XMLParser() 
var element:String! 
var currentName:String = String() 


func beginParsing() 
{ 
    parser = XMLParser(contentsOf:(NSURL(string:"URL"))! as URL)! 
    parser.delegate = self 
    parser.parse() 
} 

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
{ 
    element = elementName 
} 

func parser(_ parser: XMLParser, foundCharacters string: String) 
{ 
    if element.isEqual("name") { 
     currentName = string 
    } 
    print (currentName) -- displaying correctly 
} 

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
    if elementName.isEqual("inv") { 

     print("begginging") 
     print(currentName) -- displaying nothing 

} 
} 

К моему пониманию, я указал всю переменную в правильном месте, но переменная не сохраняется вне функции. Что я делаю не так?

ответ

0

Поскольку значение символа для элемента XML может быть огромным, возможно, что foundCharacters вызывается несколько раз для одного и того же элемента. Таким образом, вы должны добавить символы в переменную класса до didEndElement не вызывается для этого элемента:

func parser(_ parser: XMLParser, foundCharacters string: String) 
{ 
    if element.isEqual("name") { 
     currentName += string // append here 
    } 
} 

И вы должны позаботиться о правильно сбросить эту переменную на новый элемент:

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
{ 
    element = elementName 
    currentName = "" // reset 
} 

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
    if elementName.isEqual("inv") { 

     print("begginging") 
     print(currentName) // is now complete 
    } 
} 
+0

Спасибо, что сработали. Другое дело, что когда я аннулирую его в didStart, он отображается как пустой, но когда я аннулирую его в didend внутри оператора if, все работает нормально. огромное спасибо –

0

НЕ забывайте, что XML - это потоковый протокол - что это значит - он не дает вам всю информацию сразу, поэтому вам нужно добавить к уже имеющейся информации. Что вам нужно сделать в foundCharacters является:

currentName += string 

и возобновить currentName в начале/конце элемента синтаксического анализа.

currentName = "" 
Смежные вопросы