Iphone 解析XML时获取错误
为此,我正在尝试使用TouchXml解析xml文件。不幸的是,我得到了错误Iphone 解析XML时获取错误,iphone,objective-c,xml,Iphone,Objective C,Xml,为此,我正在尝试使用TouchXml解析xml文件。不幸的是,我得到了错误 实体:第1行:解析器错误:应为开始标记,“我以前也有过类似的情况(不是在目标c中,而是在c#中),当开始xml标记和其他节点之前/之间有空格或换行符时。去掉所有空白,看看这是否解决了您的问题。问题实际上与数据编码有关。来自服务器的数据是unicode格式的。我需要将其转换为utf8,然后才能解析数据 为了转换数据,我首先将其存储在NSString中(initWithData dataUsingEncoding:nsUni
实体:第1行:解析器错误:应为开始标记,“我以前也有过类似的情况(不是在目标c中,而是在c#中),当开始xml标记和其他节点之前/之间有空格或换行符时。去掉所有空白,看看这是否解决了您的问题。问题实际上与数据编码有关。来自服务器的数据是unicode格式的。我需要将其转换为utf8,然后才能解析数据
为了转换数据,我首先将其存储在NSString中(initWithData dataUsingEncoding:nsUnicoding),然后从string中创建新的NSData。但我几乎可以肯定,有一种更简单的方法可以在不创建额外字符串的情况下将数据从一种编码转换为另一种编码。。。如果有任何帮助,我们将不胜感激。您是否首先检查了XML文件?从哪一个最简单的开始:如果它有效。我认为问题可能出在XML文件上,虽然我已经检查了它,但我尝试使用从internet上找到的简单示例XML文件,像这样:Nifnif Nufnuf naf,但结果是一样的,哪一行抛出了错误?“nodes=[doc nodesForXPath:@”//nodeX“error:nil];”?我想我知道是哪部分代码导致了这个问题。touchxml现在工作正常,但问题实际上在于数据。当我从服务器获取数据并将其记录下来时,我看到了一个很长的字节列表,这意味着数据的传输是正确的。但是,当我尝试使用NSUTF8StringEncoding将此数据转换为字符串时,该字符串的nslog输出为(null)。当选择[NSString defaultCStringEncoding]时,字符串的输出是˛<,而使用ASCIstringEncoding则是ÿþÿþ好的。这里有一个秘密-使用什么字符编码来编码xml?您使用的方法中是否有字符编码参数/设置?您可能希望调查两端的编码是什么“代码页”,并确保它们匹配(也就是说,windows将在代码页1252中编码,如果接收端是不同的操作系统,它可能会在不同的操作系统中进行编码。h再次处理您的评论,我有大约90%的把握认为代码页是问题所在。必须通知正在二进制格式化字符串的服务器端代码使用您接收到的代码所期望的代码页进行编码。请参阅re for exmaple和可能使用的代码页实际上我认为这可能是Olga实现的方法。IMHO objective c仍然不是一种完全成熟的语言,并且仍然需要大量的工作才能使其对开发人员友好,即为什么字符串+字符串没有运算符重载?…如此小的基本操作,但不可用在我的开发人员办公室里,冗长也是一个常见的笑话
NSString *path = [[NSBundle mainBundle] pathForResource:@"SampleXml" ofType:@"xml"];
NSData *xmlData = [[NSData alloc] initWithContentsOfFile:path];
NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:1];
CXMLDocument *doc = [[[CXMLDocument alloc] initWithData:xmlData options:0 error:nil]autorelease];
NSArray *nodes = NULL;
nodes = [doc nodesForXPath:@"//nodeX" error:nil];
for(CXMLElement *node in nodes){
NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
int counter;
for(counter = 0; counter < [node childCount]; counter++){
NSString * value = [[[node childAtIndex:counter] stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if(value){
[item setObject:[[node childAtIndex:counter] stringValue] forKey:[[node childAtIndex:counter] name]];
}}
[item setObject:[[node attributeForName:@"id"] stringValue] forKey:@"id"];
[result addObject:item];
[item release];
}
NSLog(@"%@",result);
}