由于来自某个服务器的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调试器。请帮忙!
谢谢,
纳瓦
答案 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的单个字符进行比较。