2010-10-03 11 views
5

Je veux écrire un fichier pas si compliqué mais volumineux dans mon application et pouvoir l'envoyer par mail (en utilisant MFMailComposeViewController) Puisque NSXMLElement et les classes liées ne sont pas portées au SDK iPhone quelles options ai-je pour créer des documents XML? Merci d'avance.Comment écrire des fichiers XML?

+0

duplication possible de la classe [iOS XML writer class] (http://stackoverflow.com/questions/3969959/ios-xml-writer-class) – Pang

Répondre

2

auto-promotion éhontée: KSXMLWriter

+0

Extrait de votre URL: "Le support iOS serait bien dans le projet." – JosephH

+0

Cela devrait fonctionner, car je n'utilise que Foundation; Je n'ai tout simplement pas encore testé –

-1

C'est un exercice de devoirs dans le bâtiment NSString. Abstraitement, créez un protocole comme:

@protocol XmlExport 
-(NSString*)xmlElementName; 
-(NSString*)xmlElementData; 
-(NSDictionary*)xmlAttributes; 
-(NSString*)toXML; 
-(NSArray*)xmlSubElements; 
@end 

Assurez-vous que tout ce que vous enregistrez implémente et construire le XML avec quelque chose comme ce qui suit:

-(NSString*)toXML { 
    NSMutableString *xmlString; 
    NSString *returnString; 

    /* Opening tag */ 
    xmlString = [[NSMutableString alloc] initWithFormat:@"<%@", [self xmlElementName]]; 
    for (NSString *type in [self xmlAttributes]) { 
     [xmlString appendFormat:@" %@=\"%@\"", type, [[self xmlAttributes] valueForKey:type]]; 
    } 
    [xmlString appendString:@">"]; 

    /* Add subelements */ 
    for (id<XmlExport> *s in [self xmlSubElements]) { 
     [xmlString appendString:[s toXML]]; 
    } 

    /* Data */ 
    if ([self xmlElementData]) { 
     [xmlString appendString:[self xmlElementData]]; 
    } 

    /* Close it up */ 
    [xmlString appendFormat:@"</%@>", [self xmlElementName]]; 

    /* Return immutable, free temp memory */ 
    returnString = [NSString stringWithString:xmlString]; 
    [xmlString release]; xmlString = nil; 

    return returnString; 
} 
+3

La ligne release/nil est une de mes habitudes qui m'empêche d'avoir jamais problèmes de pointeur pendants. Oui, c'est inutile ici, mais le coût de la performance est très bas et l'optimiseur va probablement l'enlever. Néanmoins, c'est toujours une habitude que je recommande. –

+0

En ce qui concerne la suppression de vos vars, voir http://iphonedevelopment.blogspot.com/2010/09/dealloc.html – TomH

2

Essayez la version open source XML stream writer for iOS:

  • Ecrit dans Objective-C, un seul .h. et le fichier .m
  • Un @protocol pour le support d'espace de nom et un pour sans

Exemple:

// allocate serializer 
XMLWriter* xmlWriter = [[XMLWriter alloc]init]; 

// start writing XML elements 
[xmlWriter writeStartElement:@"Root"]; 
[xmlWriter writeCharacters:@"Text content for root element"]; 
[xmlWriter writeEndElement]; 

// get the resulting XML string 
NSString* xml = [xmlWriter toString]; 

Ce produit la chaîne XML suivante:

<Root>Text content for root element</Root> 
+0

Je ne suis pas en mesure de commenter la réponse de John Franklins, mais sa réponse est un échec classique car il ne s'échappe pas de XML. Toujours utiliser un sérialiseur approprié dans le code de production, ne pas essayer ce qui précède. – ThomasRS

+0

Ce n'est pas un moyen d'écrire des données XML dans un fichier – Arsynth

+0

Il s'agit d'un flux d'événements XML, pas d'octets. Cependant, consultez la documentation du wiki pour savoir comment afficher des octets en continu aussi. – ThomasRS

3

Je recommanderais d'utiliser KissXML. L'auteur a commencé dans une situation similaire à celle de vous et a créé un wrapper API compatible NSXML autour de libxml. Il discute des options et des décisions here sur son blog.

Questions connexes