在Cocoa中解析字符串中的简单XML?

时间:2010-05-31 22:26:52

标签: objective-c xml cocoa

我有一个简单的XML,我需要从puid-list中获取第一个' id '。我找到了很多例子,但由于命名空间,他们都没有这么做。如何将 id 作为 NSString 获取?

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>

1 个答案:

答案 0 :(得分: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,但如果你想要健壮,你也需要检查它。