将 Xml 解析为数组 (Swift)

2024-01-12

 struct person{
    var name = " "
    var sex = " "
    var age = " "
    }

var personArray: [person] = []

我的Xml字符串包含两组数据

<a>
<name> abc </name>
<sex> male </sex>
<age> 13   </age>
</a>
<a>
<name> bcd </name>
<sex> male </sex>
<age> 14   </age>
</a>

我如何将此 xml 字符串解析为 personArray?我知道如何将 xml 字符串解析为单个对象。但我不知道如何将其解析为数组。


您可以使用 NSXMLParser (或现在在 Swift 3 中的 XMLParser)。 NSXMLDocument 也是一种可能性,但在 iOS 上不可用,而 XMLParser 在所有操作系统上都可用。这是您的案例的简单实现......

struct Person { // NB capitalised your type - it's good practice
    var name = " "
    var sex = " "
    var age = " "
}
let inputString = "<a><name> abc </name><sex> male </sex><age> 13   </age></a><a><name> bcd </name><sex> male </sex><age> 14   </age></a>"

// Wrap it up or it won't be valid XML
let document = "<doc>" + inputString + "</doc>" 

// We can create a parser from a URL, a Stream, or NSData.
if let data = document.data(using: .utf16) { // Get the NSData
    let xmlParser = XMLParser(data: data) 
    let delegate = MyDelegate() // This is your own delegate - see below
    xmlParser.delegate = delegate 
    if xmlParser.parse() {
        print("Result \(delegate.personArray)")
        // "Result [Person(name: " abc ", sex: " male ", age: " 13   "), Person(name: " bcd ", sex: " male ", age: " 14   ")]\n" - as required
    }
}

class MyDelegate: NSObject, XMLParserDelegate {
    // Simple state machine to capture fields and add completed Person to array
    var personArray: [Person] = []
    enum State { case none, name, sex, age }
    var state: State = .none
    var newPerson: Person? = nil

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        switch elementName {
        case "a" :
            self.newPerson = Person()
            self.state = .none
        case "sex":
            self.state = .sex
        case "name":
            self.state = .name
        case "age":
            self.state = .age
        default:
            self.state = .none
        }
    }
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        if let newPerson = self.newPerson, elementName == "a" {
            self.personArray.append(newPerson)
            self.newPerson = nil
        }
        self.state = .none
    }

    func parser(_ parser: XMLParser, foundCharacters string: String) {
        guard let _ = self.newPerson else { return }
        switch self.state {
        case .name:
            self.newPerson!.name = string
        case .age:
            self.newPerson!.age = string
        case .sex:
            self.newPerson!.sex = string
        default:
            break
        }
    }

    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
    }            
}

为了让它在 Playgrounds 中工作,你需要首先声明委托(在调用之上),但这样读起来更好......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Xml 解析为数组 (Swift) 的相关文章

随机推荐