简体   繁体   English

在iOS swift中进行xml解析

[英]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? 我正在对Aadhar卡进行条形码或QR码扫描。我得到的响应为以下xml格式。如何使用xml解析将其转换为字典格式?

 <?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" 但它总是将currentElement作为“PrintLetterBarcodeData”返回

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. 这是我在Swift 3中编写的一些解析代码,它基于我之前在Swift 2.0中编写的Google新闻RSS阅读器 I have this code modified to handle a list of PrintLetterBarcodeData elements as well as a single one: 我修改了这段代码来处理PrintLetterBarcodeData元素列表以及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)
            }
        }
    }
}

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

It appears as though your expected XML structure only consists of the root element PrintLetterBarcodeData and its attributes. 您的预期XML结构似乎只包含根元素PrintLetterBarcodeData及其属性。

You will find the attributes of your root element in the attributeDict property in the didStartElement delegate method. 您可以在didStartElement委托方法的attributeDict属性中找到根元素的attributeDict

For example, to extract the name property, you would do: 例如,要提取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
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM