我有一个简单的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>
答案 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
,但如果你想要健壮,你也需要检查它。