的NSXMLParser和BOM字节
-
20-09-2019 - |
题
我得到我的XML文件从某些服务器的PHP查询的结果。当我得到的数据打印到控制台我得到结构良好的XML文件。当我尝试解析它使用的NSXMLParser返回NSXMLParserErrorDomain代码为4 - 空文件。 我看到XMLS,它不能关闭“>” 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调试。请帮助!
谢谢,
纳瓦
解决方案
我试图创建一个字符串与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。
其他提示
我不能肯定这是问题。我有一个非常类似的experiance该文件被编码为UTF-8,但XML头声称它是UTF-16。
由于错配我无法跟你有同样的错误解析它的结果。然而,改变从UTF-16 XML头为UTF-8固定为我我的问题。
您可能会遇到类似的问题。
好了,可能这不是摆脱BOM字节的最好的方法,但它的工作原理。对于那些谁花了几个小时我一样努力使的NSXMLParser吞下材料明细表: 鉴于,您通过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您的解析器和它只是工作!我会很高兴得到任何的意见/改善这个代码