【问题标题】:Parsing a simple XML from string in Cocoa?从 Cocoa 中的字符串解析一个简单的 XML?
【发布时间】:2013-08-29 02:11:22
【问题描述】:

我有一个简单的 XML,我需要从 puid-list 中获取 first '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>

【问题讨论】:

  • 您使用的是 Mac 还是 iPhone? iPhone 只有 NSXMLParser,但 Mac 有 NSXMLDocument(它支持 XPath)。此外,虽然你有一个命名空间,但它并没有在任何地方使用。

标签: objective-c xml cocoa


【解决方案1】:

您应该使用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: 和 @987654329 @ 获取字符串的两部分。

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

请注意,NSXMLParser 返回的名称正是字符串中的名称(无论它们是否带有前缀)。因此属性命名为mip:id 的情况很少见,但如果您想要健壮,您也需要检查这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多