首页 iOS 因控制字符导致解析 XML 失败
文章
取消

iOS 因控制字符导致解析 XML 失败

描述

最近在写一个个人项目的时候遇到解析 XML 失败的问题. 但是在 Adroid 上可以解析成功, 那么只能是我们自己的问题了. 慢慢找问题解决吧.

分析

使用 Safari 打开 xml 文件报错信息如下:

This page contains the following errors:

error on line 2722 at column 343: PCDATA invalid Char value 28 Below is a rendering of the page up to the first error.

整个报错信息最核心的就是: PCDATA invalid Char value 28.

报错信息中可以看出是因为 无效字符 的原因.

查一下 ASCII, 28 对应的是 控制字符 中的 文件分隔符. 所有的控制字符都是 不可见字符.

XML 标准中是不允许出现 控制字符 的.

既然找到了原因, 就过滤掉 控制字符 吧.

解决方法

iOSAPI 中有为我们提供 控制字符集合:

1
2
// OC
[NSCharacterSet controlCharacterSet];
1
2
// Swift
NSCharacterSet.controlCharacters

过滤控制字符:

1
2
3
4
5
6
7
// validData 为请求到的 XML 二进制数据
if var text = String(data: validData, encoding: .utf8) {
    // 此处未找到直接 remove 字符的 API
    // 因此选择了根据 控制字符 来分割字符串, 然后拼接的方法来处理
    text = text.components(separatedBy: NSCharacterSet.controlCharacters).joined()
    // 解析操作
}

在过滤之后, XML 终于解析成功.

补充

过滤掉 控制字符 的思路是对的, 但是不要忘记了 \n, \t 都是 控制字符. 如果连这 2 个也过滤掉的话, 我们的 文本 等内容可能格式会乱掉, 因此需要忽略这些常用的控制字符:

1
2
// 控制字符中忽略掉 \n \t \r
let sets = CharacterSet.controlCharacters.subtracting(CharacterSet(charactersIn: "\n\t\r"))
本文由作者按照 CC BY 4.0 进行授权