swift 使用 Foundation 框架中的 xmlParser 类解析服务器返回的 XML 数据,1. 通过 URLSession 获取 XML 数据并转换为 Data 对象,2. 利用 XMLParser 初始化并设置代理,3. 在代理方法中处理元素开始、字符内容和元素结束事件,4. 累积文本内容以避免分段丢失,最终完成书籍信息解析。

Swift 本身没有内置的 XML 解析器,但可以借助 Foundation 框架中的 XMLParser 类来原生解析服务器返回的 XML 数据流。这个类是基于事件驱动的 SAX 风格解析器,适合处理大文件或网络流数据,内存占用低。
1. 使用 XMLParser 解析服务器返回的 XML
从服务器获取 XML 后,通常以 Data 形式存在。你可以用 Data 初始化 XMLParser,并通过代理方法逐步解析内容。
示例:请求 XML 并解析
以下是一个完整的流程:发送网络请求 → 获取 XML 数据 → 使用 XMLParser 解析。
import Foundation // 定义模型存储解析结果 struct Book { var title: String = "" var author: String = "" } class XMLHandler: NSObject, XMLParserDelegate { private var books = [Book]() private var currentElement = "" private var currentTitle = "" private var currentAuthor = "" func parseXML(from data: Data) { let parser = XMLParser(data: data) parser.delegate = self if parser.parse() { print("解析完成,共 (books.count) 本书") for book in books { print("书名:(book.title),作者:(book.author)") } } else { print("解析失败,错误:(parser.parserError?.localizedDescription ?? "未知错误")") } } // 开始解析元素 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 data = string.trimmingCharacters(in: .whitespacesAndNewlines) if !data.isEmpty { switch currentElement { case "title": currentTitle += data case "author": currentAuthor += data default: break } } } // 结束元素,保存对象 func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "book" { let book = Book(title: currentTitle, author: currentAuthor) books.append(book) currentTitle = "" currentAuthor = "" } } }
2. 发起网络请求并解析 XML
使用 URLSession 获取服务器返回的 XML 数据:
func fetchAndParseXML() { guard let url = URL(string: "https://example.com/books.xml") else { return } URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("网络错误:(error.localizedDescription)") return } guard let data = data else { print("无数据返回") return } let handler = XMLHandler() handler.parseXML(from: data) }.resume() }
3. 关键点说明
XMLParser 是逐行解析的,不会一次性加载整个文档到内存,因此非常适合处理大型 XML 流。你需要关注以下几个代理方法:
- didStartElement:进入一个标签时触发,可用于判断当前节点类型
- foundCharacters:捕获标签之间的文本内容,注意可能被分段调用
- didEndElement:标签闭合时触发,适合在此处保存完整对象
⚠️ 注意:foundCharacters 可能被多次调用(如文本过长时),所以建议使用字符串拼接而不是直接赋值。
4. 示例 XML 结构
假设服务器返回如下 XML:
“`xml
上述代码将正确解析出两本书的信息。
基本上就这些。使用 Swift + Foundation 的 XMLParser 能高效、原生地处理 XML 数据流,无需第三方库,适合大多数简单到中等复杂度的 XML 解析场景。


