【问题标题】:xml parsing in iOS swiftiOS swift中的xml解析
【发布时间】:2017-01-26 22:19:49
【问题描述】:

我正在扫描 Aadhar 卡的条码或二维码。我收到以下 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"/>

我尝试了以下代码进行解析

 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”

【问题讨论】:

  • @Wain 我编辑了我的问题
  • 我认为您不必编写自己的方法来处理它,因为您更愿意使用收到的数据。如果您可以使用第三方库,则可以使用here 列出的库之一。
  • 您的 XML 只有一层。这是正常的。不过你可能对attributeDict感兴趣。
  • 您能否解码安全的 aadhar QR?在 iOS 中?

标签: ios xml swift xml-parsing nsxmlparser


【解决方案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
    }
}

【讨论】:

    【解决方案2】:

    这是我在 Swift 3 中基于我之前在 Swift 2.0 中编写的 Google News RSS reader 编写的一些解析代码。我修改了这段代码以处理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
    

    【讨论】:

    • 很高兴您提供了一种解析 aadhar 数据的方法。但您必须知道 aadhar 数据是用户的私人信息。因此,请确保不要在公共网站上展示用户的私人数据。谢谢
    猜你喜欢
    • 2021-06-12
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2019-01-08
    • 2012-08-11
    • 2017-01-12
    相关资源
    最近更新 更多