2012-03-13 1 views
0

NSXMLParser를 사용하여 원격 서버에서 XML을 구문 분석하는 문제에 봉착했습니다. 는 XML 구조는 다음과 같습니다NSXMLParser : iOS App에서 2 레벨 깊이의 XML 구문 분석

<data> 
    <sale id="example01"> 
     <article> 
      <id>123</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
     <article> 
      <id>124</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
    </sale> 
    <sale id="example02"> 
     <article> 
      <id>125</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
     <article> 
      <id>126</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
    </sale> 
</data> 

나는 성공적으로 XML을 구문 분석하고 내 CoreDataModel로 저장하지만, 파서가 첫 번째 "판매"요소와 내 기사를 잡고처럼 보인다. 다음 "판매"요소에 관해서는 파서가 오류없이 멈 춥니 다. XML에서 원격 데이터를 구문 분석하는 데 종종 NSXMLParser를 사용하지만이 문제를 해결하는 방법을 알 수는 없습니다. Sales에서 속성을 가져 오는 것이 중요합니다. 왜냐하면 "판매"요소가 섹션을 나타내며 기사에서 셀을 정의하는 TableView를 만들어야하기 때문입니다.

설명서에 루트 요소가 하나만있을 수 있다고 나와 있지만 루트 요소가 아닙니다.

수정 # 1 :

"Verkauf는"내 CoreDataModel의 뉴스 실재물에 바인딩 된 데이터 객체입니다 :

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


    // If it's the start of the XML, remove everything we've stored so far 
    if([elementName isEqualToString:@"daten"]) 
    { 
     [self emptyDataContext]; 
    } 

// Create a new Article 

    NSLog(@"Processing Element: %@", elementName); 

    if ([elementName isEqualToString:@"article"]) 
    { 
     appDelegate.saleArticles = [[NSMutableArray alloc] init]; 
     currentArticle = (Verkauf *)[NSEntityDescription insertNewObjectForEntityForName:@"Verkauf" inManagedObjectContext:managedObjectContext]; 

     return; 
    } 
} 

설정 요소 값 :

여기 내가 사용하는 코드의 일부입니다
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
     currentElementValue = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 
    else 
     [currentElementValue appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 

    NSLog(@"Processing Value: %@" ,currentElementValue); 

} 

는 요소의 값을 설정하고 CoreData 모델에 추가 :

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

    // !!! This is never called !!! 
    if([elementName isEqualToString:@"sale"]){ 
     NSLog(@"!!!!!!!!!!!!!!Section End!!!!!!!!!!!!!!!!!!!!!!!"); 
     return; 
    } 

    // If we're at the end of a county. Save changes to object model 
    if ([elementName isEqualToString:@"article"]) 
    { 
     [appDelegate.saleArticles addObject:currentArticle]; 
     // Sanity check 
     if(currentArticle != nil) 
     { 
      NSError *error; 

      // Store what we imported already 
      if (![managedObjectContext save:&error]) { 

       // Handle the error. 
       NSLog(@"%@", [error domain]); 
      } 
     } 
     return; 
    } 
    else if([elementName isEqualToString:@"teaser"]){ 
     [currentArticle setTeaser:currentElementValue]; 
    } 

    else if(..... }; 

편집 # 2 : 내 초기화 방법 :

- (BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error 
{ 
    BOOL result = YES; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; 
    // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks. 
    [parser setDelegate:self]; 
    // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser. 
    [parser setShouldProcessNamespaces:NO]; 
    [parser setShouldReportNamespacePrefixes:NO]; 
    [parser setShouldResolveExternalEntities:NO]; 

    [parser parse]; 

    NSError *parseError = [parser parserError]; 
    if (parseError && error) { 
     *error = parseError; 
     result = NO; 
    } 

    // deactivated because of ARC 
    // [parser release]; 

    return result; 
} 
+0

아마도 코드 중 일부를 게시해야 할 것입니다. 내가 볼 수있는 한 XML에 관한 이상한 점은 없다. –

답변

0

(난 당신이 아마 XML을 영국식으로 한 참고하지만) 나는 당신의 코드 또는 XML 중 아무것도 표시되지 않습니다, 그래서 하나가 그것을 놓쳤거나 (아마) 이상한 것이 었습니다.

NSXMLParser은 제공 한 것보다 많은 정보를 제공합니다. parse 메서드는 BOOL을 반환합니다. 돌아 오는게 뭐야? NO 인 경우 parserError 메서드를 사용하면 더 많은 정보를 제공하는 NSError 개체를 얻을 수 있습니다.

+0

나는 이미 init에서 parserError를 선언했다. 코드는 내 질문에있다. – DevZarak