2016-06-12 11 views
1

Ich versuche, eine XML-Datei direkt von einer URL zu analysieren, der Code hat keine Fehler, und die App öffnet gut, aber die Tabellenansicht ist leer. Hier ist der Link und der Code, den ich verwendet habe, wenn ich eine Anleitung bekommen könnte, würde es sehr geschätzt werden.XML Parsing in Swift funktioniert nicht, keine Fehler

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

ich dies durch ein Tutorial zunächst gebaut (nur das Erlernen der Seile)

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

Haben Sie den Code debuggen, um zu sehen, wohin es geht und was es tut und was nicht? – FredericP

+1

Wenn dieses Tutorial schlägt diese schrecklichen Initialisierungen in 'Parser: didStartElement: ..' Suche nach einem besseren. – vadian

Antwort

0

aktualisiert Antwort

Du hast mir gesagt in den Kommentaren, die Sie nicht haben, zu Verwenden Sie NSXMLParser.

In diesem Fall habe ich eine einfache Lösung für Ihre Analyse: Verwenden Sie CheatyXML, eine sehr einfache Bibliothek.

Zuerst folgen Sie dem einfachen install intructions.

Dann einen Parser mit Ihrer URL machen:

import CheatyXML 

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

und sicher alle Werte auszupacken, als ob Sie Wörterbücher wurden Indizierung und verwenden Sie die .string Eigenschaft, um die String-Felder Inhalt zu erhalten.

So:

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) 
} 

Ergebnis:

QFES Aktuelle Vorfälle
http://bneags01.desqld.internal/publicfeed/PublicRssFeed.aspx
QFES Aktuelle Vorfälle
http://www.rssboard.org/rss-specification
Argotic Syndication-Framework

Jetzt rufen Sie statt meiner Serie print eine Methode von Ihnen, um Ihre Variablen zu füllen, und dann laden Sie die Tabellenansicht neu, und Sie sind eingestellt.


Alte Antwort

NSXMLParser arbeitet asynchron, also, wenn Sie Ihre Tabelle neu zu laden in beginParsing(), werden die Daten nicht noch analysiert.

Sie müssen die Tabelle erneut laden, wenn der Parser die Analyse beendet hat.

Zum Glück gibt es einen Rückruf dafür.

entfernen tbData!.reloadData() aus beginParsing() und fügen Sie diese Delegatmethode stattdessen auf Ihre View-Controller:

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

Ok ich hatte ein Spiel Ich kann jetzt die Fehler loswerden und kompilieren, aber ich bekomme keine Daten angezeigt. Ich denke, ich könnte gerade bei Platz 1 mit diesem beginnen. –

+0

Fügen Sie 'print (" done ")' (oder einen Haltepunkt) in 'parserDidEndDocument' hinzu, um zu überprüfen, ob der Kontrollfluss wie erwartet dorthin gelangt. Es hilft zu debuggen, wo das eigentliche Problem ist. – Moritz

+0

Gar nichts, wie ich gesagt habe ein bisschen neu, ich habe eindeutig etwas falsch gemacht, für die Überprüfung hier ist mein überarbeiteter Code. –