2016-09-19 19 views
8

Mam skanowanie kodu kreskowego lub QR karty Aadhar. Otrzymuję odpowiedź jako następujący format xml.Jak przekonwertować to do formatu słownika za pomocą parsowania xml?parsowanie xml w iOS swift

<?xml version="1.0" encoding="UTF-8"?><PrintLetterBarcodeData uid="685860050795" name="Sangeetha D" gender="F" yob="1989" co="W/O: Dhanansekaran" house="632" street="saradhambal nagar" lm="agaramel" vtc="Nazarathpettai" po="Nazarethpettai" dist="Tiruvallur" subdist="Poonamallee" state="Tamil Nadu" pc="600123" dob="03/06/1989"/> 

Próbowałem następujący kod do parsowania

public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
    currentElement=elementName; 

    print(currentElement) 


} 

public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
    currentElement=""; 

} 

public func parser(parser: NSXMLParser, foundCharacters string: String) { 

} 

Ale jego powrocie zawsze currentElement jako „PrintLetterBarcodeData”

+0

@Wain edytowany moje pytanie – Madhumitha

+0

nie sądzę, że trzeba pisać własne metody radzenia sobie z tym, ponieważ wolisz pracować z danymi, które otrzymujesz. Możesz użyć jednej z wymienionych bibliotek [tutaj] (https://github.com/vsouza/awesome-ios#xml --html), jeśli korzystasz z bibliotek stron trzecich. – Ayazmon

+0

Twój XML ma tylko jeden poziom. To normalne. Ale możesz być zainteresowany 'attributeDict'. – Larme

Odpowiedz

5

Oto niektóre kodu parsowania napisałem w Swift 3 opartym na Google News RSS reader I wcześniej napisał w Swift 2.0. Mam ten kod zmodyfikowany do obsługi listę PrintLetterBarcodeData elementów, jak również tylko jednego:

class BarcodeData { 
    var uid: String 
    var name: String 
    var gender: String 
    var yob: String 
    var co: String 
    var house: String 
    var street: String 
    var lm: String 
    var vtc: String 
    var po: String 
    var dist: String 
    var subdist: String 
    var state: String 
    var pc: String 
    var dob: String 

    init?(dictionary: [String : String]) { 
     guard let uid = dictionary["uid"], 
      let name = dictionary["name"], 
      let gender = dictionary["gender"], 
      let yob = dictionary["yob"], 
      let co = dictionary["co"], 
      let house = dictionary["house"], 
      let street = dictionary["street"], 
      let lm = dictionary["lm"], 
      let vtc = dictionary["vtc"], 
      let po = dictionary["po"], 
      let dist = dictionary["dist"], 
      let subdist = dictionary["subdist"], 
      let state = dictionary["state"], 
      let pc = dictionary["pc"], 
      let dob = dictionary["dob"] else { 
      return nil 
     } 

     self.uid = uid 
     self.name = name 
     self.gender = gender 
     self.yob = yob 
     self.co = co 
     self.house = house 
     self.street = street 
     self.lm = lm 
     self.vtc = vtc 
     self.po = po 
     self.dist = dist 
     self.subdist = subdist 
     self.state = state 
     self.pc = pc 
     self.dob = dob 

    } 
} 

class MyParser: NSObject { 
    var parser: XMLParser 

    var barcodes = [BarcodeData]() 

    init(xml: String) { 
     parser = XMLParser(data: xml.data(using: String.Encoding.utf8)!) 
     super.init() 
     parser.delegate = self 
    } 

    func parseXML() -> [BarcodeData] { 
     parser.parse() 
     return barcodes 
    } 

} 

extension MyParser: XMLParserDelegate { 

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

     if elementName == "PrintLetterBarcodeData" { 

      if let barcode = BarcodeData(dictionary: attributeDict) { 
       barcodes.append(barcode) 
      } 
     } 
    } 
} 

Zastosowanie:

let xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><PrintLetterBarcodeData uid=\"685860050795\" name=\"Sangeetha D\" gender=\"F\" yob=\"1989\" co=\"W/O: Dhanansekaran\" house=\"632\" street=\"saradhambal nagar\" lm=\"agaramel\" vtc=\"Nazarathpettai\" po=\"Nazarethpettai\" dist=\"Tiruvallur\" subdist=\"Poonamallee\" state=\"Tamil Nadu\" pc=\"600123\" dob=\"03/06/1989\"/>" 

let parser = MyParser(xml: xmlString) 
let barcodes = parser.parseXML() // array of barcodes 
barcodes.first // your barcode 
+0

To dobrze, że dostarczyłeś sposób na analizowanie danych aadhar .. ale musisz wiedzieć, że dane aadhar są prywatnymi informacjami użytkownika. Dlatego prosimy o niepodawanie prywatnych danych użytkownika na publicznych stronach internetowych. Dzięki – Relsell

1

Wydaje się, że planują struktura XML składa się tylko z elementu głównego PrintLetterBarcodeData i jego atrybuty.

Znajdziesz atrybuty swojego elementu głównego w metodzie attributeDict w metodzie delegata didStartElement.

Na przykład, aby wyodrębnić własność name, zrobiłbyś:

public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
    currentElement=elementName; 
    print(currentElement) 
    //print name 
    if let name = attributeDict["name"] { 
     print(name) //prints Sangeetha D 
    } 
}