描述
最近在写一个个人项目的时候遇到解析 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
标准中是不允许出现 控制字符
的.
既然找到了原因, 就过滤掉 控制字符
吧.
解决方法
iOS 的 API 中有为我们提供 控制字符集合:
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"))