2011-12-13 3 views
1

XML 파일을 구문 분석하는 iOS 4 응용 프로그램을 개발 중입니다. XML의 조각은 다음과 같습니다 n으로 NSXMLParser 이상한 동작

<?xml version="1.0" encoding="utf-8" ?> 
<cards> 
    <card id ="0"> 
    <name lang="es">The Mad</name> 
    <description lang="es">...</description> 
    </card> 
... 
</cards> 

내가 <name lang="es">The Mad</name>을 분석하기 위해 다음과 같은 방법을 사용합니다.

\n\nThe Mad 

방법이 두 가지를 피할 수있다 '\ n'을 :

#pragma mark - 
#pragma mark NSXMLParserDelegate methods 

- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict 
{ 
    NSLog(@"DidStartElement: %@", elementName); 
    if ([elementName isEqualToString:@"card"]) 
    { 
     currentCard = [[Card alloc] init]; 
     NSString* arcaneNumber = [attributeDict objectForKey:@"id"]; 
     currentCard.Number = arcaneNumber; 

     return; 
    } 
    if ([elementName isEqualToString:@"name"]) 
    { 
     if ([[attributeDict objectForKey:@"lang"] isEqualToString:userLanguage]) 
     { 
      currentProperty = kNameProperty; 
      return; 
     } 
    } 
    if ([elementName isEqualToString:@"description"]) 
    { 
     if ([[attributeDict objectForKey:@"lang"] isEqualToString:userLanguage]) 
     { 
      currentProperty = kDescriptionProperty; 
      return; 
     } 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if (!currentStringValue) 
    { 
     // currentStringValue is an NSMutableString instance variable 
     currentStringValue = [[NSMutableString alloc] initWithCapacity:50]; 
    } 
    [currentStringValue appendString:string]; 
} 

- (void) parser:(NSXMLParser *)parser 
    didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName 
{ 
    NSLog(@"DidEndElement: %@", elementName); 
    if ([elementName isEqualToString:@"card"]) 
    { 
     [cards setObject:currentCard forKey:currentCard.Number]; 
     [currentCard release]; 
     currentCard = nil; 

     return; 
    } 

    if (currentProperty == kNameProperty) 
    { 
     currentProperty = kNoneProperty; 
     currentCard.Name = [currentStringValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     [currentStringValue release]; 
     currentStringValue = nil; 

     return; 
    } 

    if (currentProperty == kDescriptionProperty) 
    { 
     currentProperty = kNoneProperty; 
     currentCard.Description = currentStringValue; 
     [currentStringValue release]; 
     currentStringValue = nil; 

     return; 
    } 
} 

후, 구문 분석, 나는 다음과 같은 currentStringValue에 얻을? 왜 내가이 두 가지를 '\ n'얻는거야?

이 xml 파일은 Windows 시스템에서 가져온 것입니다. 그리고 TextWrangler를 사용하여 Classic Mac 형식으로 변환했습니다.

+0

didStartElement 및 didEndElement 구현을 표시 할 수 있습니까? – Anna

+0

방금 ​​추가했습니다. – VansFannel

+0

이 파서에 입력하는 XML 문자열을 어떻게 작성하고 있습니까? 파싱하기 전에 개행 문자를 입력 XML에서 실제 '\' 'n'문자로 변환하는 작업을 수행하고있을 가능성이 있습니까? –

답변

7

foundCharacters 대리자 메서드는 요소 사이의 공백에도 호출됩니다. <cards><card id=... 사이에 개행 문자가 있으면 호출됩니다.

나는 didStartElement의 상단에 currentStringValue을 삭제하면 현재 요소의 시작 전에 발견 된 문자를 삭제하고 foundCharacters에 의해 캡처 현재 요소 (안 사이) 내부 확인 문자 만 확인하는 것이 좋습니다.

didStartElement의 상단에

, 추가

[currentStringValue release]; 
currentStringValue = nil; 


요소의 값이 너무 XML 내용과 일치하지 않는 값을 저장 될 수 있습니다 didEndElement에서 그들을 제거 (공백을 포함하는 것이 가능하다).

+0

NSMutableArray로 currentStringValue를 사용한다면. 우리는 어떻게이 일을 할 수 있습니까? – Poonam

0

end 요소 메소드에서 현재 텍스트 문자열에서 직접 제거 할 수 있습니다. 간단히 문자열에서 검색하여 @ ""로 바꾸십시오. 나는 이러한 원치 않는 빈 항목을 대체하는 것을 좋아한다.