NSXMLParser没有读取所有元素

时间:2016-06-30 14:57:45

标签: ios xml swift parsing nsxmlparser

我需要解析一个xml文件,该文件可以在这个网站上找到:http://jpg.tartu.ee/tunniplaan/xml/arvestus1.xml(为了看到这个文件,你必须查看页面源代码!(这个文件太大了,不能在这里发布) )

我首先下载此文件,然后我的应用程序读取数据。

我正在使用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的属性?我有什么方法可以使用TimeTableSchedule

访问NSXMLParser元素属性

1 个答案:

答案 0 :(得分:1)

是的,问题是XML格式不正确。它包括:

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

属性Period在该元素中出现两次。实际上,如果您实施了NSXMLParserDelegate方法parseErrorOccurred,那么您会看到一个错误。或者,您可以使用命令行程序xmllint来检查XML。

鉴于您无法在Web服务上修复XML,理论上您可以在客户端自行修复它:

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