2010-05-31 78 views
2

我有一个简单的XML,我需要从puid-list获得第一个'id'。我发现了很多例子,但没有一个是因为命名空间而做的。如何获得ID作为NSString从Cocoa中的字符串解析简单的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 2010-06-01 08:28:06

回答

8

您应该使用NSXMLParser。在你的代码中创建一个实例,并告诉它解析:

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方法解析期间获得回调:

- (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 
    } 
} 

上处理的命名空间的注意事项如果命名空间已设置,则elementName是合格名称,因此可能有前缀(例如mip:puid)如果您在Mac上,NSXMLNode必须使用方便的类方法,localNameForName:prefixForName:获取字符串的两个部分。

此外,您可能需要NXXMLParser委托方法parser:didStartMappingPrefix:toURI:parser:didEndMappingPrefix:

请注意,由NSXMLParser返回的名称完全来自字符串的名称(关于它们是否带有前缀)。所以这个属性很少被命名为mip:id,但是如果你想变得健壮,你也需要检查这个。