我正在尝试对以下文件进行 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/