0

アプリで SOAP Web サービスを使用しています。次のステートメント (.m ファイル) を使用して要求を行います。

- (void)viewDidLoad

{

    [super viewDidLoad];



    NSString *soapMsg =

    [NSString stringWithFormat:

     @"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance>\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema>\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/>\"><soap:Body><retLoca xmlns=\"http://www.ctrlbase.nl/cbawebapp>\"><tcUser>112</tcUser></retLoca></soap:Body></soap:Envelope>"];



    NSURL *url = [NSURL URLWithString:

                  @"http://www.ctrlbase.nl/cbawebapp/getLoca.asmx>"];

    NSMutableURLRequest *req =

    [NSMutableURLRequest requestWithURL:url];



    NSString *msgLength =

    [NSString stringWithFormat:@"%d", [soapMsg length]];

    [req addValue:@"text/xml; charset=utf-8"

forHTTPHeaderField:@"Content-Type"];

    [req addValue:@"http://www.ctrlbase.nl/cbawebapp/retLoca>"

forHTTPHeaderField:@"SOAPAction"];

    [req addValue:msgLength

forHTTPHeaderField:@"Content-Length"];

    [req setHTTPMethod:@"POST"];

    [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];



    HUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];

    HUD.dimBackground = YES;

    HUD.labelText = @"Ophalen van gegevens";

    HUD.delegate = self;



    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:req delegate:self];



     if( theConnection )

     {

          webData = [NSMutableData data];

     }

     else

     {

          NSLog(@"theConnection is NULL");

     }





}



-(void) connection:(NSURLConnection *) connection

didReceiveResponse:(NSURLResponse *) response {

    [webData setLength: 0];

}



-(void) connection:(NSURLConnection *) connection

    didReceiveData:(NSData *) data {

    [webData appendData:data];

}



-(void) connectionDidFinishLoading:(NSURLConnection *) connection {

    NSLog(@"DONE. Received Bytes: %d", [webData length]);

    NSString *theXML = [[NSString alloc]

                        initWithBytes: [webData mutableBytes]

                        length:[webData length]

                        encoding:NSUTF8StringEncoding];

    //---shows the XML---

    NSLog(theXML);



   if( xmlParser )

    {



    }



    xmlParser = [[NSXMLParser alloc] initWithData:webData];

    [xmlParser setDelegate:self];

    [xmlParser setShouldResolveExternalEntities:YES];

    [xmlParser parse];



    [HUD hide:YES];

}



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

{

    if ( [elementName isEqualToString:@"retLocaResponse"] ) {



        NSLog(@"Log Output%@",[attributeDict objectForKey:@"retLocaResult"]);

        NSString *strValue= [attributeDict objectForKey:@"retLocaResult"];



        if(strValue != (NSString*)[NSNull null])

        {

            [chunks addObject:[attributeDict objectForKey:@"retLocaResult"]];

        }

        else

        {



        }



        recordResults = YES;

}

}



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

(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if ( [elementName isEqualToString:@"retLocaResponse"] ) {

        NSLog(@"Log array%@",chunks);

        [[self tableView]reloadData];



        recordResults = NO;



    }

}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {



    return [chunks count];

}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath

{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:@"UITableViewCell"];

    }



    cell.textLabel.text =[chunks objectAtIndex:indexPath.row];



    return cell;

}

しかし、場所の名前をUITableViewに入れません。何を間違っているのか、これを機能させるために何ができるのか. 申請書を完成させるために、私を助けてください。

どうもありがとう!

Samkit Jain の編集: 配列の「init」でクラッシュします。

ログ:

2013-08-09 00:12:31.631 Ctrlbase[776:c07] リクエストが終了しました 2013-08-09 00:12:31.904 Ctrlbase[776:c07] 完了。受信バイト: 381 2013-08-09 00:12:31.904 Ctrlbase[776:c07] 0640. Home5 Cash & Carry 2013-08-09 00:12:32.028 Ctrlbase[776:c07] ログ出力 (ヌル) 2013-08 -09 00:12:32.159 Ctrlbase[776:c07] * キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '* -[__NSArrayM insertObject:atIndex:]: オブジェクトを nil にすることはできません'

-

サーバーリクエスト:

    <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <retLoca xmlns="http://www.ctrlbase.nl/cbawebapp">
      <tcUser>string</tcUser>
    </retLoca>
  </soap:Body>
</soap:Envelope>

サーバーの応答:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <retLocaResponse xmlns="http://www.ctrlbase.nl/cbawebapp">
      <retLocaResult>string</retLocaResult>
    </retLocaResponse>
  </soap:Body>
</soap:Envelope>
4

1 に答える 1

3

viewDidLoad でチャンクを初期化する

- (void)viewDidLoad

   {
       chunks = [[NSMutableArray alloc] init];
      //same code here
   }

これが機能しない場合。サーバーからのデータと xml からのデータの完全なログも提供してください。

Rick de Jong の編集: サーバーからデータを取得する際に問題があります。サーバーからデータを取得していない場合、データを配列に保存できません。したがって、サーバーから適切にデータを取得してください。データがサーバーから適切に送信される場合:

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {

    NSLog(@"DONE. Received Bytes: %d", [webData length]);

    NSString *theXML = [[NSString alloc]

                    initWithBytes: [webData mutableBytes]

                    length:[webData length]

                    encoding:NSUTF8StringEncoding];



    NSLog(@"Xml is :-----------%@",theXML); // This line should print your xml coming from from server

}

その出力を教えてください。その後、必ず解決策を提供します。

もう1つ、データを解析するとき。必要なデータは、Soap のように、xml の属性としてではなくタグで提供されます。したがって、次を使用する必要があります。

if ( [elementName isEqualToString:@"retLocaResult"] ) {
   // code to save data and add to array
}

didStartElement と didEndElement で適切な結果を取得します。

次のコードで、コード remove > のもう 1 つのエラー:

NSURL *url = [NSURL URLWithString:

              @"http://www.ctrlbase.nl/cbawebapp/getLoca.asmx"];

最後に、出力を得ました:

これを使って :

.h ファイル

{
NSMutableData *webData;
NSXMLParser *xmlParser;
NSMutableArray *chunks;
BOOL recordResults;

NSMutableString *strCaptured;
}

.m ファイル

- (void)viewDidLoad

{

    [super viewDidLoad];

    chunks = [[NSMutableArray alloc] init];

    NSString *temp = @"112";

    NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><retLoca xmlns=\"http://www.ctrlbase.nl/cbawebapp\"><tcUser>%@</tcUser></retLoca></soap:Body></soap:Envelope>",temp];

   // NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance>\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema>\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/>\"><soap:Body><retLoca xmlns=\"http://www.ctrlbase.nl/cbawebapp\"><tcUser>112</tcUser></retLoca></soap:Body></soap:Envelope>"];

    NSURL *url = [NSURL URLWithString: @"http://www.ctrlbase.nl/cbawebapp/getLoca.asmx"];

    NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] initWithURL:url];

    NSString *msgLength = [[NSString alloc ]initWithFormat:@"%d",[soapMsg length]];

    [theRequest addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
    [theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    [theRequest setHTTPMethod:@"POST"];
    [theRequest setHTTPBody:[soapMsg dataUsingEncoding:NSUTF8StringEncoding]];

    //[theRequest addValue:@"http://www.ctrlbase.nl/cbawebapp/retLoca>" forHTTPHeaderField:@"SOAPAction"];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

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

-(void) connection:(NSURLConnection *) connection

didReceiveResponse:(NSURLResponse *) response {

    [webData setLength: 0];

}


-(void) connection:(NSURLConnection *) connection

    didReceiveData:(NSData *) data {

    [webData appendData:data];

}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {

    NSLog(@"DONE. Received Bytes: %d", [webData length]);

    NSString *theXML = [[NSString alloc]

                        initWithBytes: [webData mutableBytes]

                        length:[webData length]

                        encoding:NSUTF8StringEncoding];

    //---shows the XML---

    NSLog(@"Xml is :-----------%@",theXML);

    if( xmlParser )
    {

    }

    xmlParser = [[NSXMLParser alloc] initWithData:webData];

    xmlParser.delegate = self;

    [xmlParser setShouldResolveExternalEntities:YES];

    [xmlParser parse];

}


- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    strCaptured = [[NSMutableString alloc]init];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    [self.tableView reloadData];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    recordResults = false;
    [strCaptured setString:@""];

    if ([elementName isEqualToString:@"retLocaResult"]) {
        recordResults = true;
    }


}

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

    recordResults = false;

    if ([elementName isEqualToString:@"retLocaResult"]){
        [chunks addObject:strCaptured];
    }

}

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


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [chunks count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath

{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:@"UITableViewCell"];

    }

    cell.textLabel.text =[chunks objectAtIndex:indexPath.row];

    return cell;
}
于 2013-08-08T13:17:42.677 に答える