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