XMLParser 通过 parser(_:parseErrorOccurred:) 回调报告解析错误,不主动抛异常;错误发生时自动停止解析,parse() 返回 false;需在代理中保存错误并校验关键字段,必要时调用 abortParsing()。
Swift 的 XMLParser 本身不主动抛出错误,而是通过代理方法回调通知解析失败的位置和原因。 它属于“SAX 风格”解析器,边读边解析,不构建完整 DOM,因此错误处理是异步、事件驱动的,关键在于你实现的 XMLParserDelegate 方法是否正确响应。
这是**唯一专门用于报告解析错误的代理方法**。只要底层 libxml2 遇到格式问题(如标签不闭合、非法字符、编码错误、嵌套过深等),系统就会调用它,并传入一个 NSError 对象。
XMLParser.ParserErrorCode(比如 .invalidCharacter、.mismatchedTag、.documentStartTagNotClosed)error.userInfo[NSLocalizedDescriptionKey] 一般包含人类可读的提示,比如 “Opening and ending tag mismatch: book vs author”parser.parse() 会返回 false
这个方法**不会因标签语法错误而被调用**——如果起始标签本身就不合法(比如含控制字符或未转义 &),错误会在更早阶段被捕获,并走上面的 parseErrorOccurred 回调。
但它可能暴露**逻辑层面的问题**,比如遇到未知元素名或缺失必需属性。这时你要自己检查、记录、甚至提前调用 parser.abortParsing() 主动终止。
这里不报错,但要注意:libxml2 默认会把 CDATA 和普通文本一并送进来,且**不做自动编码转换或空白归一化**。如果你期望 UTF-8 但输入是 GBK,或需要过滤换行缩进,这些都得自己处理。
XMLParser(contentsOf:) 抛出 error),或触发 parseErrorOccurred
parser.currentLineNumber 和 currentColumnNumber,方便定位问题上下文
错误处理建议别只依赖 parseErrorOccurred 打印日志。推荐做法:
var lastError: Error?,在 parseErrorOccurred 里赋值并标记失败状态parser.parse() 后检查返回值:if !parser.parse() { /* 处理 lastError */ }
parser.abortParsing() 中断并设置自定义错误parser.shouldProcessNamespaces = true 和 shouldReportNamespacePrefixes = true,能暴露命名空间相关错误基本上就这些。XMLParser 的错误机制很轻量,不封装异常,也不重试,一切取决于你怎么监听、响应和收尾。