函数Swift之外无法访问变量

时间:2016-10-17 13:45:14

标签: ios xml swift nsxmlparser

这是我试图在Swift中解析XML的问题,除了值之外,一切都有效。

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

}
}

To my Understanding我已将所有变量声明在正确的位置,但变量未保留在函数之外。我做错了什么?

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

不要忘记XML是流式协议 - 这意味着什么 - 它不会立即为您提供所有信息,因此您需要附加到您已有的信息。您需要在foundCharacters中执行的操作是:

currentName += string

并在元素解析的开始/结束时更新currentName。

currentName = ""