推荐使用系统原生XMLParser,需实现XMLParserDelegate:didStartElement获取标签与属性,foundCharacters累积文本(注意多次回调),didEndElement结束处理,parseErrorOccurred捕获错误;解析应在后台队列执行。

Swift 中解析 XML 数据推荐使用系统原生的 XMLParser(基于 SAX 的事件驱动解析器),它轻量、内存友好,适合处理大文件。关键在于实现其代理协议 XMLParserDelegate,通过回调方法响应开始标签、结束标签、文本内容等事件。
实现 XMLParserDelegate 的核心方法
你需要创建一个遵循 XMLParserDelegate 的类(通常为 NSObject 子类),并在其中实现以下常用代理方法:
-
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:):遇到起始标签时调用,可获取元素名和属性字典([String: String])。这是识别节点类型和提取属性的关键入口。 -
parser(_:foundCharacters:):返回当前标签内的纯文本内容(注意:可能被多次调用,需累积拼接)。 -
parser(_:didEndElement:namespaceURI:qualifiedName:):遇到结束标签时调用,常用于完成当前对象构建或出栈。 -
parser(_:parseErrorOccurred:):解析出错时调用,应检查error.localizedDescription定位问题(如编码错误、格式不合法)。
注意字符数据的累积处理
XMLParser 不保证 foundCharacters 一次返回全部文本,尤其当内容含换行、空格或较长字符串时。正确做法是声明一个可变字符串变量(如 var currentText = ""),在 foundCharacters 中追加,在 didEndElement 中使用并清空:
用栈或状态管理嵌套结构
XML 是树形结构,代理方法是线性回调。若需还原层级关系(例如解析 ),建议维护一个元素名栈([String])或当前上下文状态(如 currentElement = "author")。在 didStartElement 入栈/更新状态,在 didEndElement 出栈/重置,从而判断当前文本属于哪个字段。
启动解析并处理结果
初始化 XMLParser 后,设置 delegate,调用 parse()。该方法同步执行,返回 Bool 表示是否成功。建议在后台队列中运行避免阻塞主线程:
parser.delegate = self
DispatchQueue.global(qos: .userInitiated).async {
if parser.parse() {
// 解析完成,使用收集的数据
} else {
// 处理 parser.parserError
}
}









