NSXMLParser和BOM字节

时间:2010-01-14 18:23:32

标签: iphone cocoa nsxmlparser byte-order-mark nsxmlparsererrordomain

由于来自某个服务器的php查询,我得到了我的xml文件。当我将结果数据打印到控制台时,我得到了结构良好的xml文件。当我尝试使用NSXMLParser解析它时,它返回NSXMLParserErrorDomain,代码为4 - 空文档。 我看到它无法解析的xmls在关闭'>'后立即有BOM(字节顺序标记)序列xml标头的标记。问题是如何摆脱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:@" "];

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

谢谢,

纳瓦

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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创建解析器,它只是工作!我很乐意对此代码进行任何评论/改进

答案 2 :(得分: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的单个字符进行比较。