我需要解析一个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
元素属性
答案 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()