-1

I am new to i phone programming.Using below code i getting response form webservice

NSString *soapMessage=[NSString stringWithFormat:
                           @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                           "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                           "<soap:Body>\n"

                           "<OnlineStatus xmlns=\"http://tempuri.org/\">\n"
                           "<CafeName>Cyber Cafe Name</CafeName>\n"
                           "<FromDate>2012-03-01</FromDate>\n"
                           "<ToDate>2013-05-03</ToDate></OnlineStatus>\n"
                           "</soap:Body>\n"

                           "</soap:Envelope>"];
    NSLog(@"%@",soapMessage);

    NSURL *url = [NSURL URLWithString:@"http://www.ebidmanagerdemo.com/gjHouseOnline/xml/XMLDataService.asmx"];
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
    [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [theRequest addValue: @"http://tempuri.org/OnlineStatus" forHTTPHeaderField:@"Soapaction"];
    [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
    [theRequest setHTTPMethod:@"POST"];
    [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    if(theConnection) {
        webData = [NSMutableData data];
    }
    else {
        NSLog(@"theConnection is NULL");

    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
    NSLog(@"%@",msgLength);
       }

}

I getting response in below format

2013-05-27 13:55:10.028 NewC Newcafezee[1191:11303] <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OnlineStatus xmlns="http://tempuri.org/">
<CafeName>Cyber Cafe Name</CafeName>
<FromDate>2012-03-01</FromDate>
<ToDate>2013-05-03</ToDate></OnlineStatus>
</soap:Body>
</soap:Envelope>
2013-05-27 13:55:13.170 NewC Newcafezee[1191:11303] DONE. Received Bytes: 18345
2013-05-27 13:55:13.170 NewC Newcafezee[1191:11303]  getting in xml <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><OnlineStatusResponse xmlns="http://tempuri.org/"><OnlineStatusResult>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;DataSet&gt;
  &lt;xs:schema id="Result" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"&gt;
    &lt;xs:element name="Result" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:choice minOccurs="0" maxOccurs="unbounded"&gt;
          &lt;xs:element name="Table"&gt;
            &lt;xs:complexType&gt;
              &lt;xs:sequence&gt;
                &lt;xs:element name="SystemDateTime" type="xs:dateTime" minOccurs="0" /&gt;
                &lt;xs:element name="CafeDateTime" type="xs:dateTime" minOccurs="0" /&gt;
                &lt;xs:element name="LicenseNumber" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="MachineIP" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="TotalClients" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="IdleClients" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="BusyClients" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="DummyIdle" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="DummyBusy" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="PCUsageSessions" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="PCUsageMinutes" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="SessionMessage" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="CreatedBy" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="CreatedDate" type="xs:dateTime" minOccurs="0" /&gt;
                &lt;xs:element name="Cybercafe" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="Email" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="AdminPassword" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="MajorVersion" type="xs:short" minOccurs="0" /&gt;
                &lt;xs:element name="MinorVersion" type="xs:short" minOccurs="0" /&gt;
                &lt;xs:element name="SalesAmount" type="xs:decimal" minOccurs="0" /&gt;
                &lt;xs:element name="PurchasesAmount" type="xs:decimal" minOccurs="0" /&gt;
                &lt;xs:element name="Revision" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="CZLicense" type="xs:string" minOccurs="0" /&gt;
              &lt;/xs:sequence&gt;
            &lt;/xs:complexType&gt;
          &lt;/xs:element&gt;
        &lt;/xs:choice&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;
  &lt;/xs:schema&gt;
  &lt;diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"&gt;
    &lt;Result&gt;
      &lt;Table diffgr:id="Table1" msdata:rowOrder="0"&gt;
        &lt;SystemDateTime&gt;2012-09-20T00:00:00-06:00&lt;/SystemDateTime&gt;
        &lt;CafeDateTime&gt;2012-09-18T11:01:54-06:00&lt;/CafeDateTime&gt;
        &lt;LicenseNumber&gt;cc&lt;/LicenseNumber&gt;
        &lt;MachineIP&gt;192.168.13.167&lt;/MachineIP&gt;
        &lt;TotalClients&gt;0&lt;/TotalClients&gt;
        &lt;IdleClients&gt;0&lt;/IdleClients&gt;
        &lt;BusyClients&gt;0&lt;/BusyClients&gt;
        &lt;DummyIdle&gt;0&lt;/DummyIdle&gt;
        &lt;DummyBusy&gt;0&lt;/DummyBusy&gt;
        &lt;PCUsageSessions&gt;0&lt;/PCUsageSessions&gt;
        &lt;PCUsageMinutes&gt;0&lt;/PCUsageMinutes&gt;
        &lt;SessionMessage&gt;LVCLPRLbSCTC&lt;/SessionMessage&gt;
        &lt;CreatedBy&gt;1&lt;/CreatedBy&gt;
        &lt;CreatedDate&gt;2012-09-20T00:00:00-06:00&lt;/CreatedDate&gt;
        &lt;Cybercafe&gt;Cyber Cafe Name&lt;/Cybercafe&gt;
        &lt;Email&gt;YOURMAIL@CAFE.COM&lt;/Email&gt;
        &lt;AdminPassword&gt;admin1&lt;/AdminPassword&gt;
        &lt;MajorVersion&gt;1&lt;/MajorVersion&gt;
        &lt;MinorVersion&gt;0&lt;/MinorVersion&gt;
        &lt;SalesAmount&gt;0.0000&lt;/SalesAmount&gt;
        &lt;PurchasesAmount&gt;0.0000&lt;/PurchasesAmount&gt;
        &lt;Revision&gt;0&lt;/Revision&gt;
        &lt;CZLicense /&gt;
      &lt;/Table&gt;
  &lt;/Result&gt;
  &lt;/diffgr:diffgram&gt;
&lt;/DataSet&gt;</OnlineStatusResult></OnlineStatusResponse></soap:Body></soap:Envelope>

I am not getting what is &lt and &gt at end of tag.I am not getting start tag and end tag in this response.and also in xml

And usign below code i am trying parse data but here its not loading data in NSXMLParser

  -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSLog(@"DONE. Received Bytes: %d", [webData length]);
        NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
        NSLog(@" getting in xml %@",theXML);    
        xmlParser = [[NSXMLParser alloc]initWithData:webData];
        [xmlParser setDelegate: self];
        [xmlParser setShouldResolveExternalEntities: YES];  
        [xmlParser parse];

        NSLog(@" iiiiii %@",xmlParser);

       }

Its show in NSXMLParser like below its empty.I want to parse data using start and end elements.

2013-05-27 13:55:13.179 NewC Newcafezee[1191:11303]  iiiiii <NSXMLParser: 0x71c7060>
Venk
  • 5,949
  • 9
  • 41
  • 52
Aslam
  • 69
  • 7

1 Answers1

0

NSXMLParser doesn't parse the data into a NSDictionary for you, it'll loop through all the elements, and you'll need to get the values that you need using its delegate (NSXMLParserDelegate).

There are frameworks, such as XMLReader (which actually uses NSXMLParser), that handles the parsing of all elements into a NSDictionary or NSArray (depending on how the xml is formatted).

NSLog(@" iiiiii %@",xmlParser); will show the description of a NSXMLParser object, and outputs correctly (it's not supposed to show the parsed content).

Regarding the & characters, those are encoded html characters. There may be an issue on the server, since it returns part of the xml encoded, and part of it decoded.

EDIT:

This needs to be added in a NSString category, and you can afterwards call this method on your string from the server response.

-(NSString *)xmlDecodedString{
    NSMutableString *ret = [[NSMutableString alloc] initWithCapacity:self.length];
    NSRange specialRange = NSMakeRange(NSNotFound, NSNotFound);
    // using %c causes some issues
    NSRange decRange = NSMakeRange(0, NSNotFound);
    for (NSUInteger i=0; i<[self length]; i++) {
        char c = [self characterAtIndex:i];
        if (specialRange.location==NSNotFound) {
            // search for the start of a special 'character' (starts with '&')
            if (c == '&'){
                if (i>decRange.location) {
                    decRange.length=i-decRange.location;
                    [ret appendString:[self substringWithRange:decRange]];
                    decRange = NSMakeRange(i+1, NSNotFound);
                }
                specialRange.location=i;
            }
        }
        else{
            // search for the end of the special 'character' (ends with ';')
            if (c == ';'){
                decRange = NSMakeRange(i+1, NSNotFound);
                specialRange.length=i-specialRange.location+1;
                NSString *special = [self substringWithRange:specialRange];
                specialRange = NSMakeRange(NSNotFound, NSNotFound);
                if ([special isEqualToString:@"&quot;"]) {
                    [ret appendString:@"\""];
                }
                else if([special isEqualToString:@"&#x27;"]){
                    [ret appendString:@"'"];
                }
                else if([special isEqualToString:@"&lt;"]){
                    [ret appendString:@"<"];
                }
                else if([special isEqualToString:@"&gt;"]){
                    [ret appendString:@">"];
                }
                else if([special isEqualToString:@"&amp;"]){
                    [ret appendString:@"&"];
                }
                else{
                    DLogWarn(@"WARNING: unhandled special entity %@", special);
                    [ret appendString:special];
                }
            }
        }
    }
    if (self.length>decRange.location) {
        decRange.length=self.length-decRange.location;
        [ret appendString:[self substringWithRange:decRange]];
    }
    return [ret autorelease];
}
Community
  • 1
  • 1
alex-i
  • 5,406
  • 2
  • 36
  • 56
  • How can i parse the xml data.its not loading in xmlparser – Aslam May 27 '13 at 12:26
  • @Aslam What does `[xmlParser parse];` return? If it returns `NO`, also `NSLog(@"%@", [xmlParser parseError]);`. You'll need to decode your xml. `xmlDecodedString` method should work well (updated in my response), however, I'd suggest that the partial encoded xml issue should be fixed from the server if possible. – alex-i May 27 '13 at 12:49
  • Had a new look, there's no issue with the xml, a part is encoded because it's set as an element's content. You should check the error that `NSXMLParser` returns – alex-i May 27 '13 at 17:59
  • Error 64 is caused by invalid xml, but the xml is valid according to http://validator.w3.org/check. Try `[xmlParser setShouldResolveExternalEntities: NO];` and see if it helps – alex-i May 28 '13 at 05:54
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/30741/discussion-between-aslam-and-alex-i) – Aslam May 28 '13 at 09:41