2016-06-30 41 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?有没有什么办法可以访问TimeTableSchedule元素属性使用NSXMLParser

回答

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

嗯,好吧,但任何其他方式访问使用的NSXMLParser或元素我应该使用另一个XML解析器吗? –

+0

您或者需要修复XML或尝试另一个解析器。 – Rob

+0

无法更改源xml文件,但无论如何感谢。 –