Swift 4 iOS:如何将XML字符串解析为单独字符串变量
在Swift 4中从字符串XML提取指定字段的方法
针对你的需求,我整理了两种在Swift 4里从字符串格式XML提取name、role等值的实用方法,一起来看看:
首先要做的第一步是清理XML字符串里的转义字符——你的MyResult输出里带有\"转义符号,这会影响解析,所以先处理:
// 清理XML字符串中的转义反斜杠 let cleanedXML = MyResult.replacingOccurrences(of: "\\", with: "")
方法一:使用原生XMLParser(灵活适配各种XML结构)
XMLParser是Foundation框架自带的解析器,适合处理大型XML或者需要逐节点自定义处理的场景。我们可以通过实现XMLParserDelegate来跟踪解析过程,提取目标字段:
1. 定义解析助手类
class XMLParserHelper: NSObject, XMLParserDelegate { // 记录当前正在解析的节点名称 private var currentElement = "" // 存储提取到的字段值 var extractedName: String? var extractedRole: String? // 开始解析某个节点时触发 func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName } // 读取节点内的文本内容时触发 func parser(_ parser: XMLParser, foundCharacters string: String) { // 去除文本中的空格和换行符 let trimmedText = string.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmedText.isEmpty else { return } // 根据当前节点名称赋值 switch currentElement { case "name": extractedName = trimmedText case "role": extractedRole = trimmedText default: break } } }
2. 执行解析并提取值
// 将清理后的XML字符串转为Data格式 guard let xmlData = cleanedXML.data(using: .utf8) else { print("无法将XML字符串转换为Data格式") return } // 初始化解析器和助手类 let parser = XMLParser(data: xmlData) let parserHelper = XMLParserHelper() parser.delegate = parserHelper // 开始解析 if parser.parse() { // 提取到值后赋值给你的变量 if let name = parserHelper.extractedName { let nameString = name print("提取到name:\(nameString)") } if let role = parserHelper.extractedRole { let roleString = role print("提取到role:\(roleString)") } } else { print("XML解析失败:\(parser.parserError?.localizedDescription ?? "未知错误")") }
方法二:使用XMLDecoder(简洁高效,适合固定结构XML)
如果你要解析的XML结构固定,XMLDecoder(Swift 4+支持)是更简洁的选择,用法和JSONDecoder类似,通过定义对应的数据模型来自动解析:
1. 定义对应XML结构的数据模型
// 对应<userDetails>节点的模型 struct UserDetails: Codable { let status: String let name: String let role: String } // 对应XML根节点的模型(因为你的XML根节点是<userDetails>,包裹在整个文档里) struct RootXML: Codable { let userDetails: UserDetails }
2. 执行解码并提取值
guard let xmlData = cleanedXML.data(using: .utf8) else { print("无法将XML字符串转换为Data格式") return } let decoder = XMLDecoder() // 如果你的XML节点命名和模型属性命名有差异,可以调整解码策略,比如下划线转驼峰 // decoder.keyDecodingStrategy = .convertFromSnakeCase do { // 解码XML数据到模型 let root = try decoder.decode(RootXML.self, from: xmlData) // 直接从模型中提取值并赋值 let nameString = root.userDetails.name let roleString = root.userDetails.role print("提取到name:\(nameString),role:\(roleString)") } catch { print("XML解码失败:\(error.localizedDescription)") }
两种方法各有优势:XMLParser更灵活,适合复杂或大型XML;XMLDecoder代码更简洁,适合结构固定的场景,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Ashique
相关产品推荐
相关产品推荐

