Himesh Himesh - 2 months ago 6
Objective-C Question

How to replace HTML values using for loop in Objective-C?

I Created html file and I replaced some values in html file. It is fine. But I want to use for loop and replace values. But my problem is it replace only final value.

my html code :

<body bgcolor="#F5DA81">
<h1><center>Simple Report</center></h1>
<p> This report contais about comapny details according to contact details.</p>
<center><b><u><h3>Company Details</h3></u></b></center>
<table>
<tr><td>Company Name:</td><td><!--company--> </td></tr>
<tr><td>Company Id :</td><td><!--companyId--></td></tr>
</table>
<center><b><u><h3>Contact Details</h3></u></b></center>
<table>
<tr><td>Contact Name:</td><td><!--contact--></td></tr>
<tr><td>Contact Id :</td><td><!--contactId--></td></tr>
</table>
</body>


My for loop array to replace values.

NSMutableArray *valueArray = [[NSMutableArray alloc]init];
NSString *va = @"NU";
NSString *va1 = @"My Name";
NSString *va2 = @"WEB";
NSString *va3 = @"My Web System";

[valueArray addObject:va];
[valueArray addObject:va1];
[valueArray addObject:va2];
[valueArray addObject:va3];

NSMutableArray *myValue = [[NSMutableArray alloc]init];
NSString *val = @"<!--company-->";
NSString *val1 = @"<!--companyId-->";
NSString *val2 = @"<!--contact-->";
NSString *val3 = @"<!--contactId-->";

[myValue addObject:val];
[myValue addObject:val1];
[myValue addObject:val2];
[myValue addObject:val3];

NSMutableString *html1=[[NSMutableString alloc]init];

for(int i = 0 ; i < 4; i++) {

NSString *myFinalString = [myValue objectAtIndex:i];
NSString *myVal = [valueArray objectAtIndex:i];
html1 =[self HtmlReportName:@"myFirst" withReplaceId:myFinalString withValue:myVal];
i = i + 1;
}

[webView loadHTMLString:html1 baseURL:[[NSBundle mainBundle] resourceURL]];


Method of Html replacing.

-(NSMutableString *) HtmlReportName:(NSString *)reportName withReplaceId:(NSString *)replaceId withValue:(NSString *)value {
NSMutableString *html;
html = [NSMutableString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:reportName ofType:@"html"] encoding:NSUTF8StringEncoding error:nil];
[html replaceOccurrencesOfString:replaceId withString:value options:0 range:NSMakeRange(0, [html length])];
return html;

}


In my web view shows only last value. I want to show all replaced value in web view.

My Edited Code ::

NSMutableString *html12 = [NSMutableString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myFirst" ofType:@"html"] encoding:NSUTF8StringEncoding error:nil];

for (NSUInteger i = 0; i < [valueArray count]; i++) {

NSString *myFinalString = [myValue objectAtIndex:i];
NSString *myVal= [valueArray objectAtIndex:i];
[html12 replaceOccurrencesOfString:myVal
withString:myFinalString
options:0
range:NSMakeRange(0, [html12 length])];
}

[webView loadHTMLString:html12 baseURL:[[NSBundle mainBundle] resourceURL]];

Answer

The issue is that you are not passing the modified HTML back into the next substitution, and you're instead reloading the original HTML each time, and are therefore losing the previous substitution.

Try this:

NSMutableString *html = [NSMutableString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:reportName ofType:@"html"]
                                                         encoding:NSUTF8StringEncoding
                                                            error:nil];
NSAssert([myValue count] == [valueArray count], @"Doh!");
for (NSUInteger i = 0; i < [valueArray count]; i++)
{
    NSString *myFinalString = [valueArray objectAtIndex:i];
    NSString *myVal= [myValue objectAtIndex:i];
    [html replaceOccurrencesOfString:myVal
                          withString:myFinalString
                             options:0
                               range:NSMakeRange(0, [html length])];
    // Remove i=i+1 !!!
}    

And dump the pointless HtmlReportName method.

NOTE you had the use of valueArray and myValue arrays back-to-front and please give them better names!

Comments