2016-06-12 22 views
1

URLから直接XMLファイルを解析しようとしていますが、コードにエラーはなく、アプリケーションは正常に開きますが、tableviewは空です。ここに私が使用したリンクとコードがあります。もし私がいくつかの指針を得ることができれば、それは大いに感謝されます。XMLの構文解析が機能しない、エラーが発生しない

https://www.ruralfire.qld.gov.au/bushfirealert/bushfireAlert.xml

私が最初にチュートリアル(ちょうどロープを学ぶ)

import UIKit 

class firecallViewController: UIViewController, NSXMLParserDelegate{ 

@IBOutlet var tbData: UITableView? 


var parser = NSXMLParser() 
var posts = NSMutableArray() 
var elements = NSMutableDictionary() 
var element = NSString() 
var title1 = NSMutableString() 
var date = NSMutableString() 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    self.beginParsing() 
} 

func beginParsing() 
{ 
    posts = [] 
    parser = NSXMLParser(contentsOfURL:(NSURL(string:"https://www.ruralfire.qld.gov.au/bushfirealert/bushfireAlert.xml"))!)! 
    parser.delegate = self 
    parser.parse() 
    tbData!.reloadData() 
} 

//XMLParser Methods 

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
{ 
    element = elementName 
    if (elementName as NSString).isEqualToString("item") 
    { 
     elements = NSMutableDictionary() 
     elements = [:] 
     title1 = NSMutableString() 
     title1 = "" 
     date = NSMutableString() 
     date = "" 
    } 
} 

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
    if (elementName as NSString).isEqualToString("item") { 
     if !title1.isEqual(nil) { 
      elements.setObject(title1, forKey: "title") 
     } 
     if !date.isEqual(nil) { 
      elements.setObject(date, forKey: "date") 
     } 

     posts.addObject(elements) 
    } 
} 

func parser(parser: NSXMLParser, foundCharacters string: String) 
{ 
    if element.isEqualToString("title") { 
     title1.appendString(string) 
    } else if element.isEqualToString("pubDate") { 
     date.appendString(string) 
    } 
} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return posts.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell")! 

    if(cell.isEqual(NSNull)) { 
     cell = NSBundle.mainBundle().loadNibNamed("Cell", owner: self, options: nil)[0] as! UITableViewCell; 
    } 

    cell.textLabel?.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String 
    cell.detailTextLabel?.text = posts.objectAtIndex(indexPath.row).valueForKey("date") as! NSString as String 

    return cell as UITableViewCell 
    } 
} 
+0

は、あなたはそれがどこに行くか確認するためにコードをデバッグし、それが何をして、それが何をしていないですか? – FredericP

+1

このチュートリアルでは、 'parser:didStartElement:..'の恐ろしい初期化が、より良いものを探していることを示唆しています。 – vadian

答えて

0

更新答え

を介してこれを建てあなたがする必要はありませんコメントで教えてくれましたNSXMLParserを使用します。

この場合、私はあなたの解析に簡単な解決策があります:CheatyXML、非常に単純なライブラリです。

まず、install intructionsに従ってください。

import CheatyXML 

let feedUrl = NSURL(string: "https://www.ruralfire.qld.gov.au/bushfirealert/bushfireAlert.xml")! 
let parser = XMLParser(contentsOfURL: feedUrl) 

かつ安全にあなたが辞書を添字しているかのようにすべての値をアンラップし、文字列フィールドの内容を取得するために.stringプロパティを使用します。

は、その後、あなたのURLとパーサを作ります。

if let parser = parser, 
    channel = parser["channel"], 
    title = channel["title"].string, 
    link = channel["link"].string, 
    description = channel["description"].string, 
    docs = channel["docs"].string, 
    generator = channel["generator"].string { 
     print(title) 
     print(link) 
     print(description) 
     print(docs) 
     print(generator) 
} 

結果:このよう

QFES現在のインシデント
http://bneags01.desqld.internal/publicfeed/PublicRssFeed.aspx
QFES現在のインシデント
http://www.rssboard.org/rss-specification
Argoticシンジケーションフレームワーク

私のシリーズではなく、printのメソッドの代わりに変数を設定し、テーブルビューをリロードすると設定されます。


旧答え

NSXMLParserは非同期に動作しますので、あなたはbeginParsing()であなたのテーブルをリロードする場合、データはまだを解析されません。

の解析が完了したら、テーブルをリロードする必要があります。

幸いにも、そのためのコールバックがあります。

beginParsing()からtbData!.reloadData()を削除し、代わりにあなたのビューコントローラに、このデリゲートメソッドを追加します。

func parserDidEndDocument(parser: NSXMLParser) { 
    tbData!.reloadData() 
} 
+0

私は今、エラーを取り除いてコンパイルすることができますが、ゼロのデータが表示されます。私は正方形1で始まるかもしれないと思います。 –

+0

'parserDidEndDocument'に' print( "done") '(またはブレークポイント)を追加して、制御フローが期待どおりに動くかどうかを確認します。実際の問題はどこでデバッグするのに役立ちます。 – Moritz

+0

私はこれについて少し新しいことを言ったので、私は明らかに何か間違ったことをしました。ここでは改訂されたコードです。 –