Image dans un fichier XML
UniX
Membre
Bonjour à tous.
Je souhaiterais pouvoir enregistrer une image (ou tout type de NSData d'ailleurs) dans un fichier XML à la structure bien définie (je ne peux donc pas faire avec du .plist).
J'ai transformé mon image en NSData, puis le NSData en NSString avec initWithBytes:length:encoding: (j'ai encodé en NSASCIIStringEncoding). Enfin, je rajoute mon NSString lors de la construction de mon fichier XML.
Tout se passe bien, et lorsque j'ouvre le fichier, je vois bien l'image transformée en texte ...
Le problème survient lors de l'importation ... Je voudrais pouvoir récupérer mon image.
J'utilise NSXMLParser pour parser le fichier et reconstruire mes objets. Là aussi tout fonctionne bien lorsque je n'ai pas d'image dans le fichier parsé, mais dès lors qu'il y en a une, le parser me retourne une erreur 1 (NSXMLParserInternalError) dès qu'il arrive sur la première ligne de texte représentant l'image ....
Je souhaiterais pouvoir enregistrer une image (ou tout type de NSData d'ailleurs) dans un fichier XML à la structure bien définie (je ne peux donc pas faire avec du .plist).
J'ai transformé mon image en NSData, puis le NSData en NSString avec initWithBytes:length:encoding: (j'ai encodé en NSASCIIStringEncoding). Enfin, je rajoute mon NSString lors de la construction de mon fichier XML.
Tout se passe bien, et lorsque j'ouvre le fichier, je vois bien l'image transformée en texte ...
Le problème survient lors de l'importation ... Je voudrais pouvoir récupérer mon image.
J'utilise NSXMLParser pour parser le fichier et reconstruire mes objets. Là aussi tout fonctionne bien lorsque je n'ai pas d'image dans le fichier parsé, mais dès lors qu'il y en a une, le parser me retourne une erreur 1 (NSXMLParserInternalError) dès qu'il arrive sur la première ligne de texte représentant l'image ....
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je n'utilise pas du .plist, c'est un format XML propre.
Ensuite, perso, je te conseil de mettre un petit bout de code si tu veux qu'on teste et cherche la raison du problème.
La conversion fait perdre beaucoup d'information qui ne seront jamais récupérés (surtout avec NSASCIIStringEncoding).
Pire, la séquence d'octets 3C2F du NSData sera convertit en chaà®ne </ ce qui ne peut que faire planter le parser xml.
Comme Mic l'a écrit, on ne sait rien sur le format de l'image que doit stocker le xml (mime64, hexa) : donc, c'est pas beaucoup d'aide que t'auras !
.
Tu dois pouvoir lui affecter directement sa valeur à partir de ton NSData et ensuite l'insérer au bon endroit dans le NSXMLDocument.
Ensuite pour récupérer le NSData, il doit y avoir des méthodes équilvalentes. En cherchant dans la référence de NSXMLNode tu dois pouvoir trouver ton bohneur !
Edit: on est bien d'accord que tu es sous Tiger ? sinon tout ce que je raconte n'est pas valable.
J'ai donc mon NSData à mettre dans le fichier XML.
Laurris, je n'utilise pas NSXML (dispo que dans 10.4) pour construire mon fichier XML. Je le construis à la main en ajoutant au fur et à mesure des NSString dans une NSString générale, puis en archivant à la fin cette NSString générale dans un fichier.
Tu devrais tout simplement utiliser un autre framework XML disponible dans une version antérieure, ou bien limité ton app à Tiger!
Sinon, on peut procéder autrement car tu auras certainement remarqué que dans plusieurs cas les images étaient enregistrées en dehors du fichier (un rtfd par exemple). Ceci permet de résoudre ton problème (qui n'en ai pas un à mon avis mais bref).
Ceci permet aussi de réduire la taille du fichier à enregistrer ainsi que d'éventuelles corruptions. Puis mac os x pourra défragmenter le machin plus facilement (sur le principe)).
elf, tu dis d'utiliser un autre framwork XML disponible dans une version antérieure, en connais-tu un ?
Supermic, comment utilises tu le NSMutableDictionary pour faire le fichier XML ? Je ne te suis pas ...
Si je ne trouve pas de solution, j'ai prévu de faire comme tu l'indiques Supermic, les images seront dans un fichier à part, à côté du fichier XML, mais avant, je veux essayer de voir s'il est possible de les mettre dans le fichier XML ....
Il existe de multiples méthodes.
La plus simple : transformer ton NSData en un NSString contenant de l'hexa : 1 octet est représenté en hexadécimal. C'est simple, fiable et sûr. La routine de conversion est très facile à écrire. C'est compatible xml. Mais, cela double le volume de l'image (1 octet=2 caractères).
Une autre solution, courante dans le monde du xml, est de transformer le flux binaire (ton NSData) en un flux codé en base64. Ici, c'est une solution assez universelle. Le flux base64 peut être mis en NSString. Le volume du flux base64 n'est que de 1 tiers (environ) supérieur au NSData. Par contre, il n'existe pas de routine de conversion simple à coder (recherche ici, il y a un topic qui en parle). D'autre part, le flux base64 peut contenir des < ou >, ce qui perturbe le xml. Généralement, il faut convertir ces caractère en leur représentation html (style < ou >), ce qui complique l'encodge/décodage.
Il peut exister aussi d'autres moyens. Bref, à toi de réfléchir un peu, et de trouver ce qui te convient le mieux.
.
sinon, tu peux faire un format de fichier propre à ton application qui est en fait un package
Je vais essayer de rechercher sur Google, voir si je trouve un framework d'export XML.
Au lieu de pleurnicher sur le pourquoi du comment, si tu nous disais quel format dois-tu utiliser pour ton flux binaire dans le xml ?
Parce que là tu tournes (et par la même occasion, tu nous fais tourner) en rond !
.
PS : je ne pleurniche pas, j'essaye de trouver des solutions.
Il n'y est pas question d'image... tout au plus l'utilisation d'un lien qui pointerait sur le fichier.
.
Et comme je l'ai dit plus haut, je cherche une solution pour intégrer l'image directement dans le fichier XML, mais si je n'y arrive pas ou si c'est trop complexe, je mettrais les images dans un fichier à part, avec un lien dans le XML ....