2010-05-31 3 views
2

나는 간단한 XML을 가지고 있는데, 먼저 'id'을 puid-list에서 가져와야합니다. 나는 많은 예제를 발견했으나 네임 스페이스 때문에 아무 것도하지 않았다. NSString으로 바꾸려면 어떻게해야합니까?코코아에서 간단한 XML을 문자열로 파싱 하시겠습니까?

PS : 저는 Mac에 있습니다.

<genpuid songs="1" xmlns:mip="http://musicip.com/ns/mip-1.0#"> 
    <track file="/htdocs/test.mp3" puid="0c9f2f0e-e72a-c461-9b9a-e18e8964ca20"> 
    <puid-list> 
     <puid id="0c9f2f0e-e72a-c461-9b9a-e18e8964ca20"/> 
    </puid-list> 
    </track> 
</genpuid> 
+0

Mac 또는 iPhone을 사용하십니까? iPhone에는 NSXMLParser 만 있지만 Mac에는 NSXMLDocument (XPath를 지원함)가 있습니다. 또한 네임 스페이스가 있지만 어디에서도 사용되지 않습니다. – JeremyP

답변

8

당신은 NSXMLParser를 사용해야합니다. 코드에서 인스턴스를 생성하고 구문 분석하도록 지시 :

: 처리 네임 스페이스에

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

    /* handle namespaces here if you want */ 

    if([elementName isEqualToString:@"puid"]){ 
     NSString * ID = [attributeDict objectForKey:@"id"]; 
     // use ID string, or store it in an ivar so you can access it somewhere else 
    } 
} 

주 :

NSData * XMLData = [myXMLString dataUsingEncoding:NSUnicodeStringEncoding]; 
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:XMLData]; 
[parser setDelegate:self]; 
[parser setShouldProcessNamespaces:YES]; // if you need to 
[parser parse]; // start parsing 

은 다음 구문 분석하는 동안 콜백을 얻을 수 NSXMLParserDelegate의 메소드를 구현해야 네임 스페이스가 설정된 경우 elementName은 정규화 된 이름이므로 접두사를 사용할 수 있습니다 (예 : mip:puid). Mac의 경우 NSXMLNode은 편리한 클래스 메서드 인 localNameForName:과을 사용해야합니다.문자열의 두 부분을 가져옵니다.

또한 NXXMLParser 대리자 메서드 parser:didStartMappingPrefix:toURI:parser:didEndMappingPrefix:을 원할 수도 있습니다.

NSXMLParser에 의해 반환되는 이름은 문자열의 접두사와 정확히 일치한다는 점에 유의하십시오 (앞에 접두사가 있는지 여부와 관련하여). 따라서 속성의 이름은 mip:id 인 경우는 드뭅니다. 그러나 강건하기를 원한다면이 점을 확인해야합니다.

관련 문제