2016-06-30 3 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. Фактически, если вы внедрили метод NSXMLParserDelegateparseErrorOccurred, вы бы увидели ошибку. Или вы можете использовать программу командной строки xmllint для проверки XML.


Учитывая, что вы не можете исправить 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-файл, но в любом случае спасибо. –