Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我的XML解析器在Swift中不断迭代标记?_Ios_Xml_Swift_Parsing - Fatal编程技术网

Ios 为什么我的XML解析器在Swift中不断迭代标记?

Ios 为什么我的XML解析器在Swift中不断迭代标记?,ios,xml,swift,parsing,Ios,Xml,Swift,Parsing,我试图解析XML格式的天气数据,但我的解析器似乎在迭代所有标记,而不是我指定的标记。 因此,在我的didStartElement函数中: func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { if(elem

我试图解析XML格式的天气数据,但我的解析器似乎在迭代所有标记,而不是我指定的标记。 因此,在我的didStartElement函数中:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
    if(elementName == "cap:event") {
        capEventFound = true
    }
}
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")
    }
}
还有我的didEndElement函数:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
    if(elementName == "cap:event") {
        capEventFound = true
    }
}
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")
    }
}
我的解析器函数:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
    if(elementName == "cap:event") {
        capEventFound = true
    }
}
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()
}
例如,当我选择Colorado时,我的输出在这里:


它为什么要这样做?我如何才能让它只发布相关的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
    }
}

它继续遍历标记,因为它从不调用
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
    }
}