这是我试图在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我已将所有变量声明在正确的位置,但变量未保留在函数之外。我做错了什么?
答案 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 = ""