2010-05-31 7 views
2

J'ai un XML simple et je dois obtenir le d'abord 'id' de puid-liste. J'ai trouvé beaucoup d'exemples mais aucun d'eux ne le fait à cause de l'espace de noms. Comment obtenir le l'ID en tant que NSString?Analyse d'un simple XML à partir d'une chaîne dans Cocoa?

PS: Je suis sous 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

Êtes-vous sur un Mac ou un iPhone? Les iPhones ont seulement NSXMLParser, mais les Mac ont NSXMLDocument (qui supporte XPath). De plus, bien que vous ayez un espace de noms, il n'est utilisé nulle part. – JeremyP

Répondre

8

Vous devez utiliser NSXMLParser. Créer une instance dans votre code et lui dire analyser:

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 

alors vous devez mettre en œuvre les méthodes de NSXMLParserDelegate pour obtenir callbacks lors de l'analyse syntaxique:

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

Remarques sur la manipulation namespaces:

Si les espaces de noms sont définis, elementName est le nom qualifié, donc pourrait avoir préfixe (par exemple mip:puid) Si vous êtes sur le Mac, NSXMLNode a des méthodes de classe de commodité, localNameForName: et prefixForName: pour obtenir les deux parties de la chaîne.

En outre, vous pouvez utiliser les méthodes de délégué NXXMLParserparser:didStartMappingPrefix:toURI: et parser:didEndMappingPrefix:.

Notez que les noms renvoyés par NSXMLParser sont exactement ceux de la chaîne (en ce qui concerne leur préfixe). Il est donc rare que l'attribut soit nommé mip:id, mais si vous voulez être robuste, vous devez également vérifier cela.