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

Kri*_*oks 2 xml cocoa objective-c

我有一个简单的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>
Run Code Online (Sandbox Code Playgroud)

moh*_*enr 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
Run Code Online (Sandbox Code Playgroud)

那么你需要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
    }
}
Run Code Online (Sandbox Code Playgroud)

处理命名空间的注意事项:

如果设置了名称空间,elementName则是限定名称,因此可以有前缀(例如mip:puid)如果您在Mac上,NSXMLNode必须使用便捷类方法,localNameForName:prefixForName:获取字符串的两个部分.

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

请注意,返回的名称NSXMLParser正是字符串中的名称(关于它们是否带有前缀).因此,很少有属性被命名mip:id,但如果你想要健壮,你也需要检查它.