XMLParser 通过 parser(_:parseErrorOccurred:) 回调报告解析错误,不主动抛异常;错误发生时自动停止解析,parse() 返回 false;需在代理中保存错误并校验关键字段,必要时调用 abortParsing()。

Swift 的 XMLParser 本身不主动抛出错误,而是通过代理方法回调通知解析失败的位置和原因。 它属于“SAX 风格”解析器,边读边解析,不构建完整 dom,因此错误处理是异步、事件驱动的,关键在于你实现的 XMLParserDelegate 方法是否正确响应。
parser(_:parseErrorOccurred:)
这是**唯一专门用于报告解析错误的代理方法**。只要底层 libxml2 遇到格式问题(如标签不闭合、非法字符、编码错误、嵌套过深等),系统就会调用它,并传入一个 NSError 对象。
- 错误码通常来自
XMLParser.ParserErrorCode(比如.invalidCharacter、.mismatchedTag、.documentStartTagNotClosed) -
error.userInfo[NSLocalizedDescriptionKey]一般包含人类可读的提示,比如 “Opening and ending tag mismatch: book vs author” - 此时 parser 已自动停止,
parser.parse()会返回false
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)
这个方法**不会因标签语法错误而被调用**——如果起始标签本身就不合法(比如含控制字符或未转义 &),错误会在更早阶段被捕获,并走上面的 parseErrorOccurred 回调。
但它可能暴露**逻辑层面的问题**,比如遇到未知元素名或缺失必需属性。这时你要自己检查、记录、甚至提前调用 parser.abortParsing() 主动终止。
这个cms是为使用的人设计的,并不是给程序员设计的,可以免费使用,免费版不提供技术支持,看时间情况可以帮你处理使用当中遇到的问题,呵呵,希望大家都能挣点小钱!3.1主要更新:1.优化了静态页面生成速度2.更改了系统后台框架3.更改了模板调用标签4.修复了模板部分调用错误5.优化了其他部分细节
0 parser(_:foundCharacters:)
这里不报错,但要注意:libxml2 默认会把 CDATA 和普通文本一并送进来,且**不做自动编码转换或空白归一化**。如果你期望 UTF-8 但输入是 GBK,或需要过滤换行缩进,这些都得自己处理。
- 若字符串含无法解码的字节序列,通常已在 parser 初始化时失败(比如
XMLParser(contentsOf:)抛出 error),或触发parseErrorOccurred - 建议在接收字符前检查
parser.currentLineNumber和currentColumnNumber,方便定位问题上下文
实际错误处理建议
别只依赖 parseErrorOccurred 打印日志。推荐做法:
- 在 delegate 中持有一个
var lastError: Error?,在parseErrorOccurred里赋值并标记失败状态 - 调用
parser.parse()后检查返回值:if !parser.parse() { /* 处理 lastError */ } - 对关键字段做运行时校验(例如日期格式、数值范围),失败时用
parser.abortParsing()中断并设置自定义错误 - 调试时打开
parser.shouldProcessNamespaces = true和shouldReportNamespacePrefixes = true,能暴露命名空间相关错误
基本上就这些。XMLParser 的错误机制很轻量,不封装异常,也不重试,一切取决于你怎么监听、响应和收尾。