ios - 如何在 Swift3 iOS 中进行 XML 解析?

标签 ios swift xml-parsing nsmutablearray nsxmlparser

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

<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 类:

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 ==是否流派”时,它仅解析流派标题而不解析轨道详细信息。如何将流派标题和歌曲详细信息保存在一个自定义数组中?

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

最佳答案

您需要重新考虑您的解析策略。

每当新元素开始时,XMLParser 就会触发 didStartElement。所以第一次出现在“流派”元素上。

接下来的两个元素是“track”,因此解析器再次为每个元素触发 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
    }
}

关于ios - 如何在 Swift3 iOS 中进行 XML 解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52418876/

相关文章:

ios - UIPageViewController 滑动忽略 SwiftUI 的 navigationBarHidden(true)

xml to r 数据提取

jquery - 设置隐藏的下拉选择值会导致页面在 iOS 11 safari 中重新加载

ios - 返回具有之前存在的相同方向的 View

ios - UIImagePickerController 也没有在首次使用时请求许可

ios - 无法识别的选择器发送到实例日期选择器 - swift

iphone - 在xml解析中找不到子元素时如何向数组添加默认值?

excel - 具有默认命名空间的 XML::LibXML

ios - 如何在返回值之前等待关闭完成

ios - 更改 UITextInput 中的字体