2016-08-05 10 views
4
struct person{ 
    var name = " " 
    var sex = " " 
    var age = " " 
    } 

var personArray: [person] = [] 

Meine XML-Zeichenfolge enthält zwei Gruppe von DatenParse XML-Daten in Array (Swift)

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

Wie kann ich diese XML-Zeichenfolge in personArray analysieren? Ich weiß, wie man eine XML-Zeichenkette in einzelnes Objekt analysiert. aber ich weiß nicht, wie man das in Array eingliedert.

+0

Wie wäre es mit dieser Bibliothek: https://github.com/drmohundro/SWXMLHash? – t4nhpt

Antwort

2

Sie können NSXMLParser (oder XMLParser, wie es jetzt in Swift 3 ist) verwenden. NSXMLDocument ist ebenfalls eine Möglichkeit, ist aber für iOS nicht verfügbar, während XMLParser für alle Betriebssysteme verfügbar ist. Hier ist eine einfache Implementierung Ihres Falles ...

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) { 
    }    
} 

es in Spielplätze zu bekommen arbeiten Sie den Delegaten deklarieren müssen zuerst (über dem Aufruf), aber es liest sich besser auf diese Weise ...