0

由于来自某个服务器的 php 查询,我正在获取我的 xml 文件。当我将结果数据打印到控制台时,我得到了结构良好的 xml 文件。当我尝试使用 NSXMLParser 解析它时,它返回带有代码 4 的 NSXMLParserErrorDomain - 空文档。我看到它无法解析的 xml 在关闭 xml 标头的“>”标记后立即具有 BOM(字节顺序标记)序列。问题是如何摆脱 BOM 序列。我试图用这样的 BOM 字节创建一个字符串:

    const   UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString    *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString    *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];

但由于某种原因它不起作用。有 xml,在根元素之后有这个序列。在这种情况下,NSXMLParser 成功解析了 xml。Safari 会忽略这些字符。所以 Xcode 调试器。请帮忙!

谢谢,

纳瓦

4

3 回答 3

0

我不确定这是否是问题所在。我有一个非常相似的经验,文件被编码为 UTF-8,但 xml 标头声称它是 UTF-16。

由于不匹配,我无法使用与您相同的错误来解析它。但是,将 xml 标头从 UTF-16 更改为 UTF-8 解决了我的问题。

您可能会遇到类似的问题。

于 2010-01-14T18:31:48.683 回答
0

好吧,这可能不是摆脱 BOM 字节的最佳方法,但它确实有效。对于那些像我一样花费数小时试图让 NSXMLParser 吞下 BOM 的人:假设您通过 NSURLConnection 获取数据并将其存储在 NSMutableData *webData 中。

    const char bom[3] = {0xEF, 0xBB, 0xBF};

char *data = [webData mutableBytes];
char *cp = data, *pp;
long lessBom = 0;
do {
    cp = strstr((const char *)cp, (const char *)bom);
    if (cp) {
        pp = cp;
        cp += 3;
        memcpy(pp, cp, strlen(cp));
        lessBom += 3;
    }
} while (cp != NULL);

NSMutableData   *newData = [[NSMutableData alloc] initWithBytes:data length:webData.length - lessBom];

然后你用 newData 创建你的解析器,它就可以工作了!我很高兴收到对此代码的任何评论/改进

于 2010-01-15T07:36:02.750 回答
0

我试图用这样的 BOM 字节创建一个字符串:

const   UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString    *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString    *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];

但由于某种原因它不起作用。

确保在实例化时提供了正确的编码noBOMString。如果文档数据是 UTF-8,请确保将字符串实例化为 UTF-8。同样,如果数据是 UTF-16,请确保将字符串实例化为 UTF-16。

如果你传递了错误的编码,要么字符串根本不会实例化(我假设这不是你的问题),要么某些字符会出错。BOM 将是其中之一:如果输入是 UTF-8 并且您将其解释为 MacRoman 或 ISOLatin1,它将在字符串中显示为三个单独的字符。这三个单独的字符不会与作为 BOM 的单个字符进行比较。

于 2010-01-16T08:14:57.987 回答