Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

xml parsing in iOS swift

I am having bar or QR code scanning of Aadhar card.I am getting the response as the following xml format.How to convert this into dictionary format using xml parsing?

 <?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"/>

I tried the following code for parsing

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

}

But its returning always the currentElement as "PrintLetterBarcodeData"

like image 892
Madhumitha Avatar asked Sep 19 '16 09:09

Madhumitha


People also ask

What is XML parser in iOS Swift?

An XMLParser notifies its delegate about the items (elements, attributes, CDATA blocks, comments, and so on) that it encounters as it processes an XML document.

What is XML iOS?

Like Android XML, iOS also used XML file for Designing the UI part call Storyboard or nib file. if you could Right-Click and select Open As "Source code" you will find XML code their. The way android used Layout for UI is different from iOS. iOS used Auto-layout technology to set Margin and layout.

Why use XML?

By using XML, Web agents and robots (programs that automate Web searches or other tasks) are more efficient and produce more useful results. General applications: XML provides a standard method to access information, making it easier for applications and devices of all kinds to use, store, transmit, and display data.

How do I parse an XML file in iOS?

In this tutorial a xml file will be parsed using a XMLParser object. The results of the parsing will be displayed in a Table View. This tutorial is made with Xcode 10 and built for iOS 12. For product name, use IOSParseXMLTutorial and then fill out the Organization Name and Organization Identifier with your customary values.

How to create a swift app for iOS 12 with Xcode?

This tutorial is made with Xcode 10 and built for iOS 12. For product name, use IOSParseXMLTutorial and then fill out the Organization Name and Organization Identifier with your customary values. Enter Swift as Language and choose Next. Remove the View Controller from the Storyboard and drag a Navigation Controller to the empty canvas.

What is an XML parser?

An event driven parser of XML documents (including DTD declarations). An XMLParser notifies its delegate about the items (elements, attributes, CDATA blocks, comments, and so on) that it encounters as it processes an XML document.

How to use swxmlhash for XML indexing?

Using SWXMLHash, you will need to make an XMLIndexer from your xmlString by parsing it (you can use configurations, they can be found on GitHub: Now, that you have an indexer, you can get the values by simply stating the key values the parser should search for:


2 Answers

Here's some parsing code I wrote in Swift 3 based off of a Google News RSS reader I previously wrote in Swift 2.0. I have this code modified to handle a list of PrintLetterBarcodeData elements as well as a single one:

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

Usage:

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
like image 89
JAL Avatar answered Oct 27 '22 21:10

JAL


It appears as though your expected XML structure only consists of the root element PrintLetterBarcodeData and its attributes.

You will find the attributes of your root element in the attributeDict property in the didStartElement delegate method.

For example, to extract the name property, you would do:

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
    }
}
like image 23
Craig Grummitt Avatar answered Oct 27 '22 20:10

Craig Grummitt