【问题标题】:NSXMLParser problem with "&"(Ampersand) characterNSXMLParser 问题与“&”(与号)字符
【发布时间】:2011-11-09 15:07:11
【问题描述】:

由于“&”字符,我的 NSXMLParsing 无法正常工作。我的代码如下。有什么帮助吗?

 NSString *myRequestString = [NSString stringWithFormat:@"http://abc.com/def/webservices/aa.php?family_id=%d",self.passFamilyId];
//NSLog(@"Requested Service = %@",myRequestString);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:myRequestString]];
[request setHTTPMethod: @"POST" ];
NSData *downloadedData = [ NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *str = [[NSString alloc] initWithData:downloadedData encoding:NSASCIIStringEncoding];
//NSString *contentString = [str stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
NSData * data=[str dataUsingEncoding:NSUTF8StringEncoding];


//NSLog (@"string is :%@" ,str);    

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];   

// Call the XMLParsers's initXMLParse method.
ClientDetailXmlParser *parser = (ClientDetailXmlParser*)[[ClientDetailXmlParser alloc] initXMLParser];
[xmlParser setDelegate:parser];
BOOL success = [xmlParser parse];

// Check for XML parsing.
if(success) 
{
    NSLog(@"No Errors in clientDetailXml.xml");     
}
else 
{
    NSLog(@"Error Error Error in clientDetailXml.xml!!!");
}   

[parser release];
parser = nil;

if (objClientAddUpdate != nil) {
    [objClientAddUpdate createBubbleList];
}

【问题讨论】:

  • 将“&”替换为“&”是否有效?
  • 不,我不能尝试。你能改变我的代码吗?我不知道..我不知道应该如何在我的代码中替换哪个字符串..
  • 修改你的clientDetailXml.xml文件并将&替换为'and'

标签: iphone objective-c ios nsxmlparser nsxml


【解决方案1】:

替换

NSString *str = [[NSString alloc] initWithData:downloadedData encoding:NSASCIIStringEncoding];
//NSString *contentString = [str stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
NSData * data=[str dataUsingEncoding:NSUTF8StringEncoding];

与:

NSString *str = [[NSString alloc] initWithData:downloadedData encoding:NSASCIIStringEncoding];
NSString *contentString = [str stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
NSData * data=[contentString dataUsingEncoding:NSUTF8StringEncoding];

【讨论】:

  • 如果字符串已转义与符号 (&),则此方法不是解决方案。因此,使用正则表达式仅查找未转义的 & 符号似乎更合适。
【解决方案2】:

与 sepehr-mahmoudian 的回答非常相似,但不是替换任何 & 你应该只替换 & 未转义的字符,为此你可以使用正则表达式:

NSString *str = [[NSString alloc] initWithData:downloadedData encoding:NSASCIIStringEncoding];
//NSString *contentString = [str stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
NSData * data=[str dataUsingEncoding:NSUTF8StringEncoding];

与:

NSString *str = [[NSString alloc] initWithData:downloadedData encoding:NSASCIIStringEncoding];

NSRange searchedRange = NSMakeRange(0, [str length]);
NSString *pattern = @"&(?!(#[0-9]{2,4}|[A-z]{2,6});)";
NSError *error = nil;

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
str = [regex stringByReplacingMatchesInString:str options:0 range:searchedRange withTemplate:@"&"];

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

【讨论】:

    【解决方案3】:

    这对我有用:

    NSString *response = [[NSString alloc]initWithData:dataResponse encoding:NSUTF8StringEncoding];
    NSString *newResponse = [response stringByReplacingOccurrencesOfString:@"&amp:" withString:@"AND"];
    NSData *dataObj = [newResponse dataUsingEncoding:NSUTF8StringEncoding];
    

    如果我用符号'&'替换它,响应将是正确的,但它会抛出解析错误:68。所以我不得不使用'and'。

    【讨论】:

    • 很多时候 & 不仅仅是文字,而是 URL 或其他指令的一部分,所以这可能会破坏事情。最好以保持其含义完整的方式对内容进行转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2010-09-12
    • 2011-05-17
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多