加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

parser:parseErrorOccurred31#parser:parseErrorOccur

发布时间:2020-12-14 02:13:44 所属栏目:百科 来源:网络整理
导读://取XML文件的前40个字节NSData*xmldata=[self.ItemDatasubdataWithRange:NSMakeRange(0,40)];//以UTF-8编码进行解码NSString*xmlstr=[[NSStringalloc]initWithData:xmldataencoding:NSUTF8StringEncoding];//NSLog(@"XMLHEADER:%@",xmlstr);//搜索GB2312,
//取XML文件的前40个字节
NSData*xmldata=[self.ItemDatasubdataWithRange:NSMakeRange(0,40)];

//以UTF-8编码进行解码
NSString*xmlstr=[[NSStringalloc]initWithData:xmldataencoding:NSUTF8StringEncoding];
//NSLog(@"XMLHEADER:%@",xmlstr);
//搜索GB2312,如果找到,就对整个文件进行编码转换
if([xmlstrrangeOfString:@""GB2312""options:NSCaseInsensitiveSearch].location!=NSNotFound)
{
//NSLog(@"GB2312encodingfounded.");

NSStringEncodingenc=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString*utf8str=[[[NSStringalloc]initWithData:self.ItemDataencoding:enc]autorelease];
utf8str=[utf8strstringByReplacingOccurrencesOfString:@""GB2312""withString:@""utf-8""options:NSCaseInsensitiveSearchrange:NSMakeRange(0,40)];
NSData*newData=[utf8strdataUsingEncoding:NSUTF8StringEncoding];
self.ItemData=newData;
}

GB2312或GBK编码的网页,要先用gb编码解码,然后替换其中的gb字符串,再用utf8编码成data给parser就能解析中文网页了。


NSXMLParser 将停止解析在遇到特殊字符后


我读一个 XML 文件从谷歌天气 api 和解析它使用 NSXMLParser。城市问题是巴黎。这是我得到的简短 xml 输出

<?xmlversion="1.0"?>
<xml_api_replyversion="1">
<weathermodule_id="0"tab_id="0"mobile_row="0"mobile_zipped="1"row="0"section="0"><forecast_information>
<citydata="Paris,?le-de-France"/>
<postal_codedata="Paris"/>
<latitude_e6data=""/>
<longitude_e6data=""/>
...
...

现在我用来削去此 xml 的代码是

NSString*address=@"http://www.google.com/ig/api?weather=Paris";
NSURL*URL=[NSURLURLWithString:address];

NSXMLParser*parser=[[NSXMLParseralloc]initWithContentsOfURL:URL];
[parsersetDelegate:self];
[parserparse];
...

-(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qualifiedNameattributes:(NSDictionary*)attributeDict
{

NSLog(@"XMLParser1...elementName...%@",elementName);

}

这是我获得上述 xml 的输出

XMLParser1...elementName...xml_api_reply
XMLParser1...elementName...weather
XMLParser1...elementName...forecast_information

问题是它分析的所有标记,直到它到达"城市数据"因为巴黎 ? l e de 法国,然后它就会停止的名称中有非 ascii 字符。它不会处理之后像 postal_code 的标签。纬度、 经度等。

所以我的问题是,有什么办法可以从返回的 URL XML 字符串中删除所有非 ascii 字符吗?

解决方法 1:

还行。我已经解决了此问题。这是怎么弄来的工作。

我首先做的就是用特殊字符的 URL 的 XML。然后我去掉从 XML 字符串的所有特殊字符。然后我将字符串转换为 NSdata 然后把 nsdata 对象传递给我的 NSXMLParser。因为它有没有更多特殊字符 NSXMLParser 是快乐。

这里是为任何人在将来可能会遇到的代码。大感谢您对这篇文章作出了贡献的人 !

NSString*address=@"http://www.google.com/ig/api?weather=Paris";
NSURL*URL=[NSURLURLWithString:address];
NSError*error;
NSString*XML=[NSStringstringWithContentsOfURL:URLencoding:NSASCIIStringEncodingerror:&error];

//REMOVEALLNON-ASCIICHARACTERS
NSMutableString*asciiCharacters=[NSMutableStringstring];
for(NSIntegeri=32;i<127;i++)
{
[asciiCharactersappendFormat:@"%c",i];
}

NSCharacterSet*nonAsciiCharacterSet=[[NSCharacterSetcharacterSetWithCharactersInString:asciiCharacters]invertedSet];

XML=[[XMLcomponentsSeparatedByCharactersInSet:nonAsciiCharacterSet]componentsJoinedByString:@""];

NSData*data=[XMLdataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser*parser=[[NSXMLParseralloc]initWithData:data];
[parsersetDelegate:self];
[parserparse];

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读