2016-09-19 94 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 
    } 
}