Swift的XMLParser是怎么处理错误的

6次阅读

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

Swift 的 XMLParser 是怎么处理错误的

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() 主动终止。

parser(_:foundCharacters:)

这里不报错,但要注意:libxml2 默认会把 CDATA 和普通文本一并送进来,且 ** 不做自动 编码 转换或空白归一化 **。如果你期望 UTF-8 但输入是 GBK,或需要过滤换行缩进,这些都得自己处理。

  • 字符串 含无法解码的 字节 序列,通常已在 parser 初始化时失败(比如 XMLParser(contentsOf:) 抛出 error),或触发 parseErrorOccurred
  • 建议在接收字符前检查 parser.currentLineNumbercurrentColumnNumber,方便定位问题上下文

实际错误处理建议

别只依赖 parseErrorOccurred 打印日志。推荐做法:

  • 在 delegate 中持有一个 var lastError: Error?,在 parseErrorOccurred 里赋值并标记失败状态
  • 调用 parser.parse() 后检查返回值:if !parser.parse() { /* 处理 lastError */}
  • 对关键字段做运行时校验(例如日期格式、数值范围),失败时用 parser.abortParsing() 中断并设置自定义错误
  • 调试时打开 parser.shouldProcessNamespaces = trueshouldReportNamespacePrefixes = true,能暴露 命名空间 相关错误

基本上就这些。XMLParser 的错误机制很轻量,不 封装 异常,也不重试,一切取决于你怎么监听、响应和收尾。

站长
版权声明:本站原创文章,由 站长 2025-12-14发表,共计1455字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources