NSXMLParser 不读取所有元素

NSXMLParser not reading all elements

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

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

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

访问 TimeTableSchedule 元素属性

是的,问题是 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()