如何在 Swift3 iOS 中进行 XML 解析? [英] How to do XML Parsing in Swift3 iOS?

查看:69
本文介绍了如何在 Swift3 iOS 中进行 XML 解析?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对以下文件进行 XML 解析:

I am trying to do XML Parsing of below file :

<bgmusic>
  <genre title="Title1">
    <track title="SubTitle1" path="https://test/Background_Track%20-%20Ambient%20-%20ANW2856_01_ Animation.ogg" />
    <track title="SubTitle2" path="https://test/Background_Track%20-%20Ambient%20-%20ANW2860_02_Entanglement.ogg" />
  </genre>

  <genre title="Title2">
    <track title="SubTitle3" path="https://test/Background_Track%20-%20Ambient%20-%20ANW2856_01_Animate.ogg" />
    <track title="SubTitle4" path="https://test/Background_Track%20-%20Ambient%20-%20ANW2860_02_ SubTitle4.ogg" />
  </genre>

</bgmusic>

基本上我创建了两个 ViewController,一个用于显示流派标题,第二个 VC 用于显示详细信息.为此,我创建了以下两个 Modal 类:

Basically I have created two ViewController, one for displaying Genre Title and second VC for displaying the details of this. For this, I have created below two Modal classes:

class GenreModel {
    var title: String = ""

    var genreSongsArray = [GenreSong]()
    var genreSongs = GenreSong()
}

class GenreSong {
    var songTitle: String = ""
    var path: String = ""

}

这是我的代码:

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

       let genreModel = GenreModel()

        if(elementName == "genre"){

        if let id = attributeDict["title"] {
            genreModel.title = id
        }
       }

        if(elementName == "track")
        {
            let genreSong = GenreSong()
            for string in attributeDict {
                let strvalue = string.value as NSString
                switch string.key {
                case "title":
                    genreSong.songTitle = strvalue as String
                    break
                case "path":
                    genreSong.path = strvalue as String
                    break

                default:
                    break
                }
            }

            genreModel.genreSongsArray.append(genreSong)
        }
}

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

    }

func parser(_ parser: XMLParser, foundCharacters string: String) {

    }

我的问题是,当我给出 "elementName == Genre" 时,它只会解析 genre title 而不会解析曲目详细信息.如何在一个自定义数组中同时保存流派标题和歌曲详细信息?

My problem is when I am giving "elementName == genre" then it's only parsing genre title and not parsing track details. How can I save both Genre title and Songs details in one custom Array?

有人可以建议我吗?谢谢!

Can anyone please suggest me on this? Thank you!

推荐答案

你需要重新考虑你的解析策略.

You need to rethink your parsing strategy.

每当新元素开始时,XMLParser 都会触发 didStartElement.所以第一次出现在流派"元素上.

The XMLParser fires didStartElement whenever a new element starts. So the first occurence is on the "genre" element.

接下来的两个元素是track",因此解析器再次为每个元素触发 didStartElement.

The next two elements are "track" so the parser again fires didStartElement for each of them.

跟踪层次结构是您的责任,因此您需要将当前元素存储在变量中并处理子元素.

It is your responsibility to keep track of the hierarchy so you need to store the current element in a variable and process the subelements.

因此,每当您使用 didStartElement 检索新元素时,您都必须检查它是什么元素以及您期望进一步的子元素.这一切都取决于您的 XML 文档的结构,因此无法为您提供多合一的解决方案.

So whenever you retrieve a new element with didStartElement you have to check what element it is and what child elements you expect further. This all depends on the structure of your XML document so there is no all in one solution one can give you.

...
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
    }
}

这篇关于如何在 Swift3 iOS 中进行 XML 解析?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆