2012-07-26 1 views
0

NSXML 파서로 XML 파일을 구문 분석하는 방법 :내가, 내가 그것을 구문 분석 <code>NSXMLParser</code>을이 같은 XML 파일을 사용하고있다

<? xml version ='1.0' encoding="UFT-8"?> 
<!DOCTYPE plist PUBLIC "-//apple//DTD PLIST 1.0//EN" "http://www.apple/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<Data> 
    <item> 
    <date>2012-07-24</date> 
    <name>A</name> 
    <count>100</count> 
    <startDate>2012-07-24</startDate> 
    <stopDate>2012-07-24</stopDate>  
    </item> 
    <item> 
    <date>2012-07-24</date> 
    <name>A</name> 
    <count>100</count> 
    <startDate>2012-07-24</startDate> 
    <stopDate>2012-07-24</stopDate> 
    </item> 

</Data> 
</plist> 

- (IBAction)Parser:(id)sender { 
    NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[[NSBundle mainBundle]  URLForResource:@"file2" withExtension:@"xml"]]; 
    [xmlParser setDelegate:self]; 
    BOOL flag =[xmlParser parse]; 
    if (flag) { 
     NSLog(@"OK"); 
    } else { 
     NSLog(@"false"); 
    } 
    [xmlParser release]; 
} 


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

{ 
    NSLog(@"%@found a %@ element",self,elementName); 
    if ([elementName isEqual:@"Data"]) { 
     [data release]; 
     data = [[Data alloc]init]; 

    [data setParentParserDelegate:self]; 
    [parser setDelegate:data]; 
} 
같은 XML 파일을 구문 분석 할 IBAtion를 사용

}

printf "OK" 없습니다 더 printf "NSLog(@"%@found a %@ element",self,elementName)"

+0

http://stackoverflow.com/questions/5575934/how-to-parse-xml-with-nsxmlparser – mask8

답변

0

난 당신의 코드에서 두 가지 문제가 발견 :

첫째, XML은 잘못된 것입니다. 첫 번째 줄은 다음과 같아야합니다.

<?xml version="1.0" encoding="UTF-8"?> 

둘째, 구문 분석기 구성이 잘못되었습니다. 기본적으로 잘못된 방식으로 URL을 초기화하고 있습니다. 다음과 같아야합니다.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"file2" ofType:@"xml"]; 
NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]]; 

코드를 변경하면 완벽하게 실행됩니다.

희망이 도움이됩니다.

+0

감사합니다.이 두 가지 변경 사항으로 인해 여전히 printf"NSLog (@ "% @는 % @ element", self, elementName "을 찾았습니다.")로 혼란 스럽습니다. – tony

+0

발견했습니다. 웹에서 데이터를 다운로드하면 잘 파싱 할 수 있습니다! – tony

+0

NSURL 구조 참조. '[NSURL URLWithPath : filePath] 대신'[NSURL fileURLWithPath : filePath]'를 사용하십시오. 웹 URL에서는 모방이 효과적입니다. – Max

0

NSXMLParser는 스트림 기반이며 XML 스트림의 특정 구성 요소 (시작 태그, 텍스트, 종료 태그 등)를 만날 때 대리인에게 다양한 메시지를 보냅니다. 따라서 NSXMLParser의 인스턴스를 만들고 NSXMLParserDelegate 프로토콜을 준수하는 작성 대리자를 NSXMLParser 인스턴스에 할당합니다. (편집 : 당신은 이미이 부분을 수행하거나, 적어도에 좋은 시작을 한 수처럼 당신이 당신의 질문에 추가 한 코드에서, 그것은 보이는.)

대리자 클래스 ' -parser:didStartElement:... 방법에서

의를 확인 요소 이름. 그것이 "Message"라면, NSMutableDictionary를 새로 작성하여 자식 요소에 정보를 저장하고 그 정보를 속성에 저장하십시오 : (편집 : 코드에서 인스턴스 변수를 선언 한 것처럼 보이지만 dot 다른 요소 이름에 대한

self.listOfFriends = [NSMutableDictionary dictionary]; 

). 올바른 메모리 관리가 어떻게 확인, 속성으로 액세스 할 수을 - 구문 텍스트를 저장하는 데 사용됩니다 빈 인 NSMutableString를 생성하고,에 그 저장 재산 : 당신의 -parser:foundCharacters: 방법에서

self.thisString = [NSMutableString string]; 

는 mutabl에 문자열을 추가 이전에 작성한 문자열 속성.

[self.thisString appendString:string]; 

마지막으로 -parser:didEndElement:... 메소드에서 요소 이름을 확인하십시오. 그것이 "메시지"라면이 메시지 요소로 끝난 것입니다. XML 스트림에 Message 요소가 하나만있는 경우 (예에서와 같이) 이제 빌드 한 사전이나 그 밖의 모든 작업을 인쇄 할 수 있습니다. Message 요소가 여러 개있을 수있는 경우 방금 완료 한 메시지 요소를 배열에 추가 할 수 있습니다. 방금 종단 요소가 하지 메시지 인 경우

-setValue:forKey:는 키로 요소 이름을 전달하여 사전에 추가하고, 이전 값으로 -parser:foundCharacters: 메시지를 수신하는 동안 내장까지 문자열은 당신이 만들었습니다.

[self.listOfFriends setValue:self.thisString forKey:elementName]; 
+0

이제는 NSXMLParser.NSLog (@ "% @는 % @ 요소를 찾았습니다. ", self, elementName)이 printf가 아닙니다. – tony

관련 문제