2016-10-05 12 views
1

気象データをXML形式で解析しようとしていますが、私のパーサーは指定したタグの代わりにすべてのタグを繰り返しているようです。 だから、私は私のdidStartElement機能を持っている:XML ParserがSwiftのタグを繰り返し処理するのはなぜですか?

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

なぜこれをやっているのですか?

答えて

0

didEndElementを呼び出すことは決してないので、タグを繰り返し処理しています。これは、あなたのdidEndElement宣言が正しくないため、期待通りに呼び出されないためです。この宣言:

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

無関係が、それはそれはfoundCharactersへの複数の呼び出しを必要とするであろうことは理論的には可能ですので、foundCharactersに値を追加し、あなたのプロセスは少し危険です:

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

はする必要があります完全なイベント名を返します。一般的には、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 
    } 
} 
関連する問題