iOS swift中的xml解析

Posted

技术标签:

【中文标题】iOS swift中的xml解析【英文标题】:xml parsing in iOS swift 【发布时间】: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 中? 【参考方案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 数据是用户的私人信息。因此,请确保不要在公共网站上展示用户的私人数据。谢谢

以上是关于iOS swift中的xml解析的主要内容,如果未能解决你的问题,请参考以下文章

Swift XML解析库 - SwiftyXMLParser

iOS开发之解析XML格式数据

IOS中的XML解析之DOM和SAX

在 swift 中解析 XML 失败并出现 nil 错误

ajax中的phonegap XML解析器在iOS上出现错误

iOS网络编程开发—JSON解析与XML解析