2016-06-30 12 views
1

このサイトで見つかる内容のxmlファイルを解析する必要があります:http://jpg.tartu.ee/tunniplaan/xml/arvestus1.xml(このファイルを表示するには、ページソースコードを参照する必要がありますここでは)NSXMLParserがすべての要素を読み取っていません

私は最初にこのファイルをダウンロードして、私のアプリケーションは、データを読み込む。

私はNSXMLParserを使用しています。そのファイルから私はTimeTableSchedule属性要素が必要ですが、ファイルにその要素をNSXMLParser見つからない上に、それが存在します。

要素が見つかったかどうかを確認しましたTimeTableScheduleという名前のコードがありますが、そうではありません!それは私の質問「TimeTableSchedule」

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

を除く他のすべての要素を出力している:それは要素TimeTableScheduleが見つからないのはなぜ? TimeTableSchedule要素にはPeriodという2つの属性があります。 TimeTableSchedule要素の属性にアクセスできる方法はありますかNSXMLParser

答えて

1

はい、問題はXMLが正しく形成されていないことです。

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

属性Periodは、その要素に2回表示されます。実際にNSXMLParserDelegateメソッドparseErrorOccurredを実装した場合は、その旨のエラーが表示されます。または、コマンドラインプログラムxmllintを使用してXMLをチェックすることもできます。あなたは、WebサービスにXMLを修正することはできませんことを考えると


、あなたは理論的には、クライアントにそれを自分で修正することができます:NSXMLParserかを使用して、その要素にアクセスするための

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

うーん、いいが、任意の他の方法を私は別のXMLパーサーを使うべきですか? –

+0

XMLを修正するか、別のパーサーを試す必要があります。 – Rob

+0

ソースxmlファイルを変更できませんが、とにかく感謝します。 –

関連する問題