2016-09-19 45 views
8

我有酒吧或二維碼掃描的Aadhar card.I獲取響應爲以下xml格式。如何將此轉換爲使用xml解析的字典格式?xml在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"/> 

我嘗試下面的代碼解析

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

} 

但它總是返回currentElement爲「PrintLetterBarcodeData」

+0

@Wain我編輯我的問題 – Madhumitha

+0

我不認爲你必須寫你自己的方法來處理它,因爲你想要處理你收到的數據。如果您使用第三方庫,您可以使用[此處]列出的某個庫(https://github.com/vsouza/awesome-ios#xml--html)。 – Ayazmon

+0

您的XML只有一個級別。這是正常的。但是你可能對'attributeDict'感興趣。 – Larme

回答

5

下面是一些解析代碼我在斯威夫特3寫了一個基於掀起了Google News RSS reader我以前在雨燕2.0寫道。我有這樣的代碼修改,以處理PrintLetterBarcodeData元素的列表,以及一個單一的一個:

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

用法:

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

它很好,你提供瞭解析aadhar數據的方法..但你必須知道aadhar數據是用戶的私人信息。所以請確保不要在公共網站上顯示用戶的私人數據。謝謝 – Relsell

1

看來好像你預期的XML結構只包括根元素PrintLetterBarcodeData的及其屬性。

您可以在didStartElement委託方法的attributeDict屬性中找到根元素的屬性。

例如,提取name屬性,你會怎麼做:

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