我得到我的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您的解析器和它只是工作!我会很高兴得到任何的意见/改善这个代码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top