Вам необходимо переосмыслить свою стратегию синтаксического анализа.
XMLParser запускает didStartElement
всякий раз, когда запускается новый элемент.Таким образом, первый случай связан с элементом «жанр».
Следующие два элемента являются «треками», поэтому парсер снова запускает didStartElement
для каждого из них.
Вы несете ответственность заследите за иерархией, поэтому вам нужно сохранить текущий элемент в переменной и обработать подэлементы.
Поэтому, когда вы получаете новый элемент с помощью didStartElement
, вы должны проверить, что это за элемент и какие дочерние элементывы ожидаете дальше.Все зависит от структуры вашего XML-документа, поэтому нет единого решения, которое вы можете дать.
...
var genre = ""
var tracks = [String]()
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if(elementName == "genre") {
// new genre
tracks = []
if let id = attributeDict["title"] {
genre = id
}
}
if(elementName == "track") {
// new subElement track, add it to the tracks array here
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if(elementName == "genre") {
// genre complete with all tracks, process it
}
}