views:

180

answers:

1

I'm stuck with a problem; everything I try to parse with the NSXMLParser ends up with "†Êá"(name of element, elementText ...)

I tried different sources (the one I'd like to parse from my server, simple NSString, and from different sources from the web which deliver XML) and every time "†Êá".

//prepar request
//NSString *urlString = [NSString   stringWithFormat:@"http://192.168.1.102:8080/support/supportService"];
NSString *urlString = [NSString stringWithFormat:@"http://sites.google.com/site/iphonesdktutorials/xml/Books.xml"];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

//get response
NSHTTPURLResponse* urlResponse = nil;  
NSError *error = [[NSError alloc] init];  
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"Response Code: %d", [urlResponse statusCode]);
//if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
 NSLog(@"Response: %@", result);
 // responsecode here
 //}

NSXMLParser *parser = [[NSXMLParser alloc] initWithData: [ result dataUsingEncoding:NSASCIIStringEncoding]];
//NSXMLParser *parser = [[NSXMLParser alloc] initWithData: [ fakeResponse dataUsingEncoding:NSUTF8StringEncoding]];

[parser setDelegate:self]; // The parser calls methods in this class
//[parser setShouldProcessNamespaces:NO]; // We don't care about namespaces
//[parser setShouldReportNamespacePrefixes:NO]; //
//[parser setShouldResolveExternalEntities:NO]; // We just want data, no other stuff

[parser parse]; // Parse that data..

and the delegate methods

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
      NSLog(@"chars: %s", string);
  }

 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName  attributes:(NSDictionary *)attributeDict{


  NSLog(@"open: %s %s, %s", elementName, namespaceURI, qName);
   }

  - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {


   NSLog(@"close: %s", elementName); 
   }

i also tried different encodings such as ANSI and UTF8 .. but still I get the following results:

2010-02-17 09:29:18.377 SupportServiceWSTest[403:20b] Response Code: 200
2010-02-17 09:29:18.378 SupportServiceWSTest[403:20b] Response: <?xml version="1.0"
encoding="UTF-8"?><Books><Book id="1"><title>Circumference</title><author>Nicholas  
Nicastro</author><summary>Eratosthenes and the Ancient Quest to Measure the   
Globe.</summary></Book><Book id="2"><title>Copernicus Secret</title><author>Jack  
Repcheck</author><summary>How the scientific revolution began</summary></Book><Book 
id="3"><title>Angels and Demons</title><author>Dan Brown</author><summary>Robert 
Langdon is summoned to a Swiss research facility to analyze a cryptic symbol seared into 
the chest of a murdered physicist.</summary></Book><Book id="4"><title>Keep the 
Aspidistra Flying</title><author>George Orwell</author><summary>A poignant and 
ultimately hopeful look at class and society, Keep the Aspidistra Flying pays tribute 
to the stubborn virtues of ordinary people who keep the aspidistra 
flying.</summary></Book></Books>
2010-02-17 09:29:18.379 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.381 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.381 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.382 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.382 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.383 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.383 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.384 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.384 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.385 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.385 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.386 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.386 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.387 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.387 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.388 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.388 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.389 SupportServiceWSTest[403:20b] chars: †Êá
+2  A: 

One problem is the fact that you're using NSASCIIStringEncoding. The XML is UTF8 encoded (as specified in the XML response), so you should be using NSUTF8StringEncoding.

Another the problem is that you're using %s in your NSLog calls for NSString Objects, which won't work. %s is for C strings, null terminated character arrays, not objects. Replace %s with %@.

%@ when used in NSLog will call the description method on any object that is its matching argument. For NSStrings description will print out the contents of the string.

Jasarien
Thanks for that hint! as i said it has nothing to do with the encoding (despite im using a wrong ne here in my excample i changed it to any combination)but the %s -> %@ trick dit it! im using objc for only a week now and im not that familiar with it. i think you saved me weeks on this problem really!! :D
dustin.b