2016-06-30 14 views
1

Ich muss eine XML - Datei analysieren, deren Inhalt auf dieser Site gefunden werden kann: http://jpg.tartu.ee/tunniplaan/xml/arvestus1.xml (Um diese Datei zu sehen, müssen Sie den Seitenquellcode anschauen! (Die Datei ist zu groß, um sie zu posten) hier)NSXMLParser liest nicht alle Elemente

ich zum ersten Mal dieser Datei herunterladen und dann liest meine Anwendung die Daten in.

ich NSXMLParser verwende. Aus dieser Datei über die I-Element TimeTableSchedule Attribute benötigen, aber NSXMLParser nicht das Element in der Datei, aber es existiert

Ich überprüfte, ob es Element findet benannt TimeTableSchedule mit unten Code, aber es tut es nicht! Es druckt alle anderen Elemente mit Ausnahme von „TimeTableSchedule“

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
     print(elementName) 
    } 

Meine Fragen ist: Warum es nicht das Element nicht finden TimeTableSchedule? Hat es etwas mit diesem TimeTableSchedule-Element zu tun, hat zwei Attribute namens Period? Gibt es eine Möglichkeit, wie ich auf TimeTableSchedule Elemente Attribute zugreifen kann mit NSXMLParser

Antwort

1

Ja, das Problem ist, dass die XML nicht gut gebildet ist. Es enthält so etwas wie:

<TimeTableSchedule DayID="" Period="" Period="-1" SchoolRoomID="" SubjectGradeID="*28" ClassID="*11" OptionalClassID="" TeacherID=""/> 

Das Attribut Period zweimal in diesem Element angezeigt. In der Tat, wenn Sie NSXMLParserDelegate Methode parseErrorOccurred implementiert haben, hätten Sie einen Fehler in diesem Sinne gesehen. Oder Sie verwenden das Befehlszeilenprogramm xmllint, um das XML zu überprüfen.


Vorausgesetzt, dass Sie nicht die XML auf dem Web-Dienst beheben, könnte man theoretisch regeln es sich in dem Client:

let url = NSURL(string: "http://jpg.tartu.ee/tunniplaan/xml/arvestus1.xml")! 
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { data, response, error in 
    guard let data = data where error == nil else { 
     print(error) 
     return 
    } 

    // replace occurrences of `Period="" Period` with `Period` 

    let mutableData = data.mutableCopy() as! NSMutableData 
    let searchData = "Period=\"\" Period".dataUsingEncoding(NSUTF8StringEncoding)! 
    let replacementData = "Period".dataUsingEncoding(NSUTF8StringEncoding)! 

    var range = mutableData.rangeOfData(searchData, options: [], range: NSRange(location: 0, length: mutableData.length)) 
    while range.location != NSNotFound { 
     mutableData.replaceBytesInRange(range, withBytes: replacementData.bytes, length: replacementData.length) 
     range = mutableData.rangeOfData(searchData, options: [], range: NSRange(location: range.location, length: mutableData.length - range.location)) 
    } 

    // now parse 

    let parser = NSXMLParser(data: mutableData) 
    parser.delegate = self 
    parser.parse() 

    // do whatever you want with the parsed data here 
} 
task.resume() 
+0

Hmm, okay, aber alle anderen Möglichkeiten, dieses Element zuzugreifen unter Verwendung von NSXMLParser oder Soll ich einen anderen XML-Parser verwenden? –

+0

Sie müssen entweder das XML reparieren oder einen anderen Parser ausprobieren. – Rob

+0

Kann die Quell-XML-Datei nicht ändern, aber trotzdem danke. –