0

我正在创建一个 IOS 应用程序。在其中我必须使用 SOAP Web 服务来获取一些详细信息。这样我就使用了 SUDZ-C 来生成存根。我可以调用网络服务并得到响应。但我无法解析响应。以下是 XML 响应。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ViewAppTrackResponse xmlns="http://service.cmp.app.com">
         <ViewAppTrackResponseReturn>
            <ns1:monthBO xmlns:ns1="http://response.cmp.app.com">
               <monthListItem>
                  <ns2:date xmlns:ns2="http://bean.cmp.app.com">1-2-2014, Saturday (nonworking day)</ns2:date>
                  <ns3:lockStatus xmlns:ns3="http://bean.cmp.app.com">N</ns3:lockStatus>
                  <ns4:dailyTime xsi:nil="true" xmlns:ns4="http://bean.cmp.app.com"/>
                  <ns5:taskListNew xsi:nil="true" xmlns:ns5="http://bean.cmp.app.com"/>
               </monthListItem>
               <monthListItem>
                  <ns6:date xmlns:ns6="http://bean.cmp.app.com">2-2-2014, Sunday (nonworking day)</ns6:date>
                  <ns7:lockStatus xmlns:ns7="http://bean.cmp.app.com">N</ns7:lockStatus>
                  <ns8:dailyTime xmlns:ns8="http://bean.cmp.app.com">04:00</ns8:dailyTime>
                  <ns9:taskListNew xmlns:ns9="http://bean.cmp.app.com">
                     <taskListItem>
                        <ns9:trackId>1070</ns9:trackId>
                        <ns9:taskId>14</ns9:taskId>
                     </taskListItem>
                     <taskListItem>
                        <ns9:trackId>1094</ns9:trackId>
                        <ns9:taskId>44</ns9:taskId>
                     </taskListItem>
                  </ns9:taskListNew>
               </monthListItem>
               <monthListItem>
                  <ns10:date xmlns:ns10="http://bean.cmp.app.com">3-2-2014, Monday</ns10:date>
                  <ns11:lockStatus xmlns:ns11="http://bean.cmp.app.com">N</ns11:lockStatus>
                  <ns12:dailyTime xmlns:ns12="http://bean.cmp.app.com">08:00</ns12:dailyTime>
                  <ns13:taskListNew xmlns:ns13="http://bean.cmp.app.com">
                     <taskListItem>
                        <ns13:trackId>1071</ns13:trackId>
                        <ns13:taskId>14</ns13:taskId>
                     </taskListItem>
                     <taskListItem>
                        <ns13:trackId>1073</ns13:trackId>
                        <ns13:taskId>44</ns13:taskId>
                       </taskListItem>
                  </ns13:taskListNew>
               </monthListItem>
            </ns1:monthBO>
            <ns14:userId xsi:nil="true" xmlns:ns114="http://response.cmp.app.com"/>5</ns14:userId>
         </ViewAppTrackResponseReturn>
      </ViewAppTrackResponse>
   </soapenv:Body>
</soapenv:Envelope>

谁能帮我解析这个回复。这对我会有帮助。

4

2 回答 2

0

您可以使用 NSXMLParser 类来解析 this。使用它的委托方法可以解析。我正在发布我尝试解析你的 xml。它没有完成。我给你一个基本的解析代码。你必须做剩下的事情。这里的“xmlInput”是带有 xmlstring 的 NSString 类型。

    NSData* xmlData = [xmlInput dataUsingEncoding:NSUTF8StringEncoding];

    NSXMLParser  * xmlParser = [[NSXMLParser alloc] initWithData:[xmlData copy]];
    [xmlParser setDelegate:(id)self];
    [xmlParser setShouldResolveExternalEntities: YES];
    [xmlParser parse];

创建一个 xmlparser 对象并输入您的 xmlData.Set 其代表。

     //this delegate calls when parsing start.Only once.
    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
           recordResults = NO;//declared in .h
           MonthFlag = NO;//declared in .h
           TaskFlag = NO;//declared in .h
           Arry = nil;//declared in .h
    }

   // This delgate calls when each tag name is found.
  -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName  namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName
                attributes: (NSDictionary *)attributeDict
          {
            strElementName =  [elementName copy];//strElementName is declared in .h

                NSLog(@"%@",strElementName);
               if([elementName isEqualToString:@"monthListItem"]){
                  MonthFlag = YES;
               }
               if([elementName isEqualToString:@"taskListItem"]){
                 TaskFlag = YES;
               }
              strElementValue = @""; //strElementValue is declared in .h
          }


 //This is called when each tag value is found.
 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
 {
        strElementValue = [NSString stringWithFormat:@"%@%@", strElementValue,[string copy]];
        NSLog(@"%@",strElementValue);
       //NSLog(@"%@ : %@",strElmentName,strElementValue);
       recordResults=(strElementValue.length > 0);
  }

  // This deleagte will call in the end of each tag name.
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName
  {
           NSLog(@"%@ - %@",elementName,strElementValue);
           if (recordResults) {
             if (MonthFlag) {
                if(dicTemp==nil){
                   dicTemp = [[NSMutableDictionary alloc] init];
                for (int i=0; i<10; i++) {
                  [dicTemp setObject:@"" forKey:strElementName];
                }
              }
            [dicTemp setObject:strElementValue forKey:elementName ];
          }
             }     
              if(([elementName isEqualToString:@"monthListItem"] ) && dicTemp!=nil) {
                   if(Arry==nil)Arry = [[NSMutableArray alloc] init];
                       [Arry addObject:[dicTemp copy]];
                   dicTemp = nil;
                   [dicTemp release];
                   MonthFlag = NO;
                  NSLog(@"arry test %@",[Arry description]);
               }
      }

       // This delegate will call when parsing finishes . only once
       - (void)parserDidEndDocument:(NSXMLParser *)parser
       {
           recordResults = NO;
       }
于 2014-03-13T11:39:13.197 回答