gpt4 book ai didi

ios - 为什么我的 XML 解析器不断迭代 Swift 中的标签?

转载 作者:行者123 更新时间:2023-11-28 08:26:18 24 4
gpt4 key购买 nike

我正在尝试解析 XML 格式的天气数据,但我的解析器似乎在遍历所有标签,而不是我指定的标签。所以,我在我的 didStartElement 函数中有:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
if(elementName == "cap:event") {
capEventFound = true
}
}

和我的 didEndElement 函数:

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject])
{
if(elementName == "cap:event") {
capEventFound = false
}
}

我的解析器函数:

func parser(parser: NSXMLParser, foundCharacters string: String)
{
if(capEventFound)
{
newsStories.append(string)
print(newsStories)
}
else
{
print("No cap:event found")
}
}

解析的其他相关函数:

override func viewDidLoad() {
super.viewDidLoad()
self.pvState.delegate = self
self.pvState.dataSource = self
stateCode = ["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
{
return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return stateCode.count
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return stateCode[row]
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
selectedState = stateCode[pickerView.selectedRowInComponent(0)]
url = "http://alerts.weather.gov/cap/\(selectedState).php?x=0"
urlStr = url.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())!
searchURL = NSURL(string: urlStr as String)!
xmlParser = NSXMLParser(contentsOfURL: searchURL)!
xmlParser.delegate = self
xmlParser.parse()
}

例如,当我选择科罗拉多时,我的输出是:http://pastebin.com/v3ULvQ0G

为什么要这样做,我怎样才能让它只发布相关的 cap:event?

最佳答案

它会继续遍历标签,因为它从不调用 didEndElement。这是因为您的 didEndElement 声明不正确,因此没有像您预期的那样被调用。本声明:

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) { ... }

应该是:

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

不相关,但是您在 foundCharacters 中附加值的过程有点危险,因为理论上可能需要多次调用 foundCharacters 才能返回完整的事件名称。您通常应该只在 foundCharacters 中附加字符,并在 didEndElement 中更新您的模型结构。例如,我可能会建议:

var parsedString: String?

// element starts

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if elementName == "cap:event" {
parsedString = String()
}
}

// characters found
//
// this may be called more than once

func parser(parser: NSXMLParser, foundCharacters string: String) {
parsedString? += string
}

// element ended
//
// but, by the time we get here, we have the full parsed string

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "cap:event" {
newsStories.append(parsedString!)
parsedString = nil
}
}

关于ios - 为什么我的 XML 解析器不断迭代 Swift 中的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39884541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com