Image dans un fichier XML

UniXUniX Membre
03:24 modifié dans API AppKit #1
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 ....

Réponses

  • 03:24 modifié #2
    Je ne comprends pas pourquoi tu ne veux/peux pas garder ton image en NSData ? Pourquoi convertir en NSString ?
  • UniXUniX Membre
    03:24 modifié #3
    Ben je fais comment pour mettre le NSData dans le fichier texte ?
    Je n'utilise pas du .plist, c'est un format XML propre.
  • septembre 2006 modifié #4
    Je n'ai jamais eu à  le faire donc je ne sais pas mais je me demande pourquoi tu n'utilises pas un NSDictionary (plist) en transformant les objets qui ne savent s'écrire en "clair" en NSData.

    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.
  • BruBru Membre
    03:24 modifié #5
    Y'a rien de pire que de transformer un NSData en NSString.
    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 !

    .
  • laurrislaurris Membre
    septembre 2006 modifié #6
    Il faudrait initialiser le NSXMLNode qui contient ton image avec initWithKind:options: et NSXMLNodeIsCDATA comme option.
    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.
  • UniXUniX Membre
    03:24 modifié #7
    Pour le type d'image, c'est un simple JPEG obtenu à  partir d'un NSImage via
    NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:[monImage TIFFRepresentation]];<br />NSData *imageJpeg = [imageRep representationUsingType:NSJPEGFileType properties:nil];
    


    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.
  • elfelf Membre
    03:24 modifié #8
    ça fait mal, ça!

    Tu devrais tout simplement utiliser un autre framework XML disponible dans une version antérieure, ou bien limité ton app à  Tiger!
  • 03:24 modifié #9
    Mais pourquoi (diable !) tu ne veux pas utiliser un NSMutableDictionary ??

    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)).
  • UniXUniX Membre
    03:24 modifié #10
    Je ne veux pas limiter mon appli à  Tiger, j'ai tout fait jusqu'à  maintenant pour l'éviter.

    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 ....
  • BruBru Membre
    03:24 modifié #11
    dans 1158484570:

    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 &lt; ou &gt;), 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.

    .
  • elfelf Membre
    03:24 modifié #12
    j'ai déjà  rencontré plusieurs frameworks XML, mais je ne me rapelle malheureusement pas de leur noms

    sinon, tu peux faire un format de fichier propre à  ton application qui est en fait un package
  • UniXUniX Membre
    03:24 modifié #13
    Et non, je ne peux pas ..... Le format basé sur XML dont je veux créer des fichiers est standardisé ..... Je ne suis pas libre de tout ...

    Je vais essayer de rechercher sur Google, voir si je trouve un framework d'export XML.
  • BruBru Membre
    03:24 modifié #14
    dans 1158506538:

    Et non, je ne peux pas ..... Le format basé sur XML dont je veux créer des fichiers est standardisé ..... Je ne suis pas libre de tout ...


    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 !

    .
  • UniXUniX Membre
    septembre 2006 modifié #15
    Du GPX : www.topografix.com/gpx.asp

    PS : je ne pleurniche pas, j'essaye de trouver des solutions.
  • BruBru Membre
    03:24 modifié #16
    J'ai consulté le site que tu donnes.

    Il n'y est pas question d'image... tout au plus l'utilisation d'un lien qui pointerait sur le fichier.

    .
  • UniXUniX Membre
    03:24 modifié #17
    En fait tu peux rajouter tes propres infos entre les balises "extensions".

    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 ....
Connectez-vous ou Inscrivez-vous pour répondre.