2016-10-17 106 views
0

這裏是我試圖解析Swift中的XML除了值之外的所有工作的問題。無法在函數外部訪問的變量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中將其取消時,它顯示爲空,但是當我在if語句的內側中將其取消時,一切正常。非常感謝 –

0

不要忘記XML是流式協議 - 這意味着什麼 - 它不會一次給你所有的信息,所以你需要追加到你已有的信息。你需要在foundCharacters做的是:

currentName += string 

和元素解析的開始/結束續約currentName。

currentName = ""