2012-06-21 2 views
2

Добрый день всем,Синтаксический WebService IOS данных

Я скачал данные из веб-службы, и им ищет, чтобы разобрать эти данные, так что я могу использовать его, но у меня возникают проблемы при синтаксическом возвращаемые значения, ниже код и все Приобретение еще между какой-либо помощью будут оценены

-(IBAction)runNewImport:(id)sender{ 


recordResults = FALSE; 

soapMessage = [NSString stringWithFormat: 

       @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 

       "<s:Envelope \n" 

       "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n" 
       "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" 
       "xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" \n" 
       "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" \n" 
       "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"> \n"  


       "<s:Body> \n" 

       "<[FUNCTION] xmlns=\"http://tempuri.org/\"/>\n" 

       "</s:Body> \n" 
       "</s:Envelope>"]; 


[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
NSURL *url = [NSURL URLWithString:@"http://[PATH]"];  
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];    
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];   
[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];  
[theRequest addValue: @"[FUNCTION]" 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]; 
    NSLog(@"%@",webData); 
} 
else { 
    NSLog(@"theConnection is NULL"); 
}  



} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
NSLog(@"DONE. Received Bytes: %d", [webData length]); 
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
NSLog(@"THIS IS THE DATA : %@",theXML); 


xmlParser = [[NSXMLParser alloc] initWithData: webData]; 
[xmlParser setDelegate:self]; 
[xmlParser setShouldResolveExternalEntities: YES]; 
[xmlParser parse]; 


} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *) 
elementName namespaceURI:(NSString *) 
namespaceURI qualifiedName:(NSString *)qName 
    attributes: (NSDictionary *)attributeDict 
{ 
if([elementName isEqualToString:@"CODE"]) 
{ 
    soapResults = [[NSMutableString alloc] init]; 
    NSLog(@"%@",soapResults); 
    recordResults = TRUE; 
} 
} 

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

{ 
if([elementName isEqualToString:@"CODE"]) 
{ 
    recordResults = FALSE; 
    soapResults = nil; 
    } 
} 

Спасибо за взгляд и снова, вся помощь приветствуется

+2

Вы забыли упомянуть, что проблемы вы столкнулись при анализе. – lawicko

+1

Кроме того, возврат 'soapResults' из' NSLog', вероятно, пуст, да? –

+0

yep, его даже не появляется.Проблема заключается в том, что его не разборе и ив пытался выяснить это на некоторое время теперь, то XML есть и доступны ниже найти образец файла XML –

ответ

5

Вы, кажется, не понимают, как работает NSXMLParser. Я призываю вас принять хороший взгляд на этот документ от компании Apple XML parsing

-(void)parser:didStartElement:namespaceURI:qualifiedName:attributes: 

этот метод вызывается, когда анализатор находит отверстие XML тег, как, так что он не имеет никаких данных о нем пока нет. Здесь вам нужно только Alloc памяти все, что вы хотите сохранить

- (void)parser:foundCharacters: 

вызывается, когда есть данные внутри тега, который был найден в parser:didStartElement:namespaceURI:qualifiedName:attributes: это, где вы храните, что данные первого, так что вы можете позже сохранить его на объект, который вы хотите по следующему методу:

-(void)parser:didEndElement:namespaceURI:qualifiedName 

вызывается, когда парсер встречает закрывающий тег(). Теперь у вас есть данные, которые вы сохранили в переменной в parser:foundCharacters:, и пришло время сохранить ее в вашем объекте.

EDIT: Хорошо, давайте попробуем и разбить его, добавив примеры кода в этих методах:

Допустим, у вас есть XML, глядя, как это;

<person> 
    <lastName>Doe</lastName> 
    <firstName>John</firstName> 
    <address> 
     <street>100 Main Street</street> 
     <city>Somewhere</city> 
    </address> 
</person> 

Естественно, вы хотели бы иметь Person класс со свойствами LastName, ПгвЬЫат и addressDictionary содержащих улицы и городом. И чтобы сохранить все Person, вам понадобится personArray.

Теперь у нас есть структура, вот парсинг. Пожалуйста, обратите внимание, что для лучшего понимания, я буду писать каждый Если блок отдельно.

.h файл

@property (nonatomic, retain) Person *currentPerson; 
@property (nonatomic, retain) NSMutableString *currentElement; 
@property (nonatomic, retain) NSMutableDictionary *addressDic; //to be saved to person.addressDictionary when finished 
@property (nonatomic, retain) NSMutableArray *personArray; 

.m файл

- (void)parserDidStartDocument:(NSXMLParser *)parser 
{ 
    personArray = [[NSMutableArray alloc] init]; 
} 

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName 
namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict 
{ 
    if ([elementName isEqualToString:@"Person"]) 
    { 
    currentPerson = [[Person alloc] init]; // 
    return; 
    } 
    if ([elementName isEqualToString:@"lastName"]) 
    { 
     currentElement = [[NSMutableString alloc] init]; 
     return; 
    } 
    if ([elementName isEqualToString:@"firstName"]) 
    { 
     currentElement = [[NSMutableString alloc] init]; 
     return; 
    } 
    if ([elementName isEqualToString:@"address"]) 
    { 
     adressDic = [[NSMutableDictionary alloc] init]; 
     return; 
    } 
    if ([elementName isEqualToString:@"street"]) 
    { 
     currentElement = [[NSMutableString alloc] init]; 
     return; 
    } 
    if ([elementName isEqualToString:@"city"]) 
    { 
     currentElement = [[NSMutableString alloc] init]; 
     return; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    [currentElement appendString:string]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"Person"]) 
    { 
    [personArray addObject:currentPerson]; 
    [currentPerson release]; 
    return; 
    } 
    if ([elementName isEqualToString:@"lastName"]) 
    { 
     currentPerson.lastName = currentElement; 
     [currentElement release]; currentElement = nil; 
     return; 
    } 
    if ([elementName isEqualToString:@"firstName"]) 
    { 
     currentPerson.firstName = currentElement; 
     [currentElement release]; currentElement = nil; 
     return; 
    } 
    if ([elementName isEqualToString:@"address"]) 
    { 
     currentPerson.addressDictionary = addresDic; 
     [addressDic release]; 
     return; 
    } 
    if ([elementName isEqualToString:@"street"]) 
    { 
     [addressDic setObject:currentElement forKey:@"street"]; 
     [currentElement release]; currentElement = nil; 
     return; 
    } 
    if ([elementName isEqualToString:@"city"]) 
    { 
     [addressDic setObject:currentElement forKey:@"city"]; 
     [currentElement release]; currentElement = nil; 
     return; 
    } 
} 

Когда все это делается, parserDidEndDocument: вызывается. Теперь, когда у вас есть все Person с в массиве, делать все, что вы хотите с ними

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    for (Person *person in personArray) 
    { 
      NSLog(@"Person name:%@", person.firstName); 
      NSLog(@"Person lastname:%@", person.lastName); 
    } 
} 
+0

Спасибо, но как бы вы его изменили? im спрашиваю, потому что у меня есть опыт работы с XML Parsing, потому что я уже сделал что-то раньше, но я не могу заставить это работать –

+0

Что вы имеете в виду, изменив его? –

+0

Это было абсолютно блестяще, я никогда не пытался помочь мне так много, но, увы, это настоящий мир, он все еще не работает, у меня есть чувство, что это связано с форматом xml, м, я отправил образец вверх, чтобы попытаться понять остальных, у меня такое чувство, что это будет ночь в одиночестве:/Thumbs up для блестящего ответа –

Смежные вопросы