2014-06-15 3 views
0

SOAP 응답에서 다음 XML을 어떻게 파싱해야합니까?SOAP 응답에서 그룹 XML 노드 구문 분석 - 목적 C

<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> 
    <areaSearchResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<areaSearchReturn xsi:type="ns1:QueryBean" xmlns:ns1="http://rpc.xml.coldfusion"> 
<details soapenc:arrayType="xsd:anyType[4]" xsi:type="soapenc:Array"> 
    <details xsi:type="soapenc:string">photo1.jpg</data> 
    <details xsi:type="soapenc:int">1224</data> 
    <details xsi:type="soapenc:double">552.0</data> 
    <details xsi:type="soapenc:double">20.04</data> 
</details> 
<details soapenc:arrayType="xsd:anyType[4]" xsi:type="soapenc:Array"> 
    <details xsi:type="soapenc:string">photo2.jpg</data> 
    <details xsi:type="soapenc:int">1234</data> 
    <details xsi:type="soapenc:double">632.0</data> 
    <details xsi:type="soapenc:double">34.05</data> 
</details> 

didEndElement 내 위의 코드에서

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

if([[attributeDict valueForKey:@"xsi:type"] isEqualToString:@"soapenc:Array"] 
    && [[attributeDict valueForKey:@"soapenc:arrayType"] isEqualToString:@"xsd:anyType[4]"]){ 

    _propertyInfoArray = [[NSMutableArray alloc] init]; 
    self.isNewRow = YES; 
    NSLog(@" New Row Created "); 
}else{ 
    self.isNewRow = NO; 
    _rawData = [[NSMutableString alloc] init]; 
} 

} 

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

} 

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

    if(self.isNewRow){ 
     NSLog(@"Previous Row will be Added to NSSet"); 
    }else{ 
     [_propertyInfoArray addObject:_rawData]; 

     NSLog(@"Value %@ ",_rawData); 
    } 
} 

} 

을 다음과 같이 내가 NSXMLParser를 사용하고 있습니다 : 방법 나는 언제나처럼 self.isNewRow의 값을 얻고 거짓 (NO) 는 왜입니까?

위의 XML을 구문 분석 할 수있는 다른 방법은 무엇입니까? 또는 그룹 노드를 구문 분석하는 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

답변

1

해결되었습니다. 저는 XML을 파싱하기 위해 KissXML과 xPath를 사용했습니다. 다음은 XML을 파싱하기 위해 동일한 문제를 겪고있는 사람을위한 코드입니다.

DDXMLDocument *doc = [[DDXMLDocument alloc] initWithData:data options:0 error:&err]; 
NSArray *areaSearchNode = [doc nodesForXPath:@"/soapenv:Envelope/soapenv:Body/areaSearchResponse/areaSearchReturn/details/" error:&err]; 

    for(DDXMLDocument *node in areaSearchNode){ 
    NSArray *newRoot = node.children; 

    DDXMLNode *photoURL = (DDXMLNode*) newRoot[0]; 

    DDXMLNode *listingID = (DDXMLNode*) newRoot[1]; 
    NSString *listingIDstr = [listingID stringValue]; 

    DDXMLNode *priceFrom = (DDXMLNode*) newRoot[2]; 
    NSString *price = [priceFrom stringValue]; 

    DDXMLNode *latNode = (DDXMLNode*) newRoot[3]; 
    NSString *lat = [latNode stringValue]; 

    DDXMLNode *lonNode = (DDXMLNode*) newRoot[4]; 
    NSString *lon = [lonNode stringValue]; 

    DDXMLNode *bedroomType = (DDXMLNode*) newRoot[5]; 
    NSString *bedroomTypestr = [bedroomType stringValue]; 

    DDXMLNode *bathroomType = (DDXMLNode*) newRoot[6]; 
    NSString *bathroomTypestr = [bathroomType stringValue]; 

    // Here adding parsed data into class 
    IDSPropertyInfo *propertyInfo = [[IDSPropertyInfo alloc] 
             initWithPhotoURL:[photoURL stringValue] 
             listingID:[listingIDstr intValue] 
             priceFrom:[price doubleValue] 
             lat:[lat doubleValue] 
             lon:[lon doubleValue] 
             bedroomTypeID:[bedroomTypestr intValue] 
             bathroomTypeID:[bathroomTypestr intValue]]; 
} 

    //Now Add IDSPropertyInfo Class into NSMutableArray. 
[self.propertyInfoArray addObject:propertyInfo];