Enlever les balises xml et sauver en ascii [gros volume inside] - Shell/Batch - Programmation
Marsh Posté le 14-01-2004 à 18:10:01
Tu installe un processeur XST (xalan par exemple), c'est exactement la transformation obtenue avec un fichier XSL sans traitement particulier.
Marsh Posté le 20-01-2004 à 16:04:48
Une solution avec sed, on supprime toutes les balises "<xxx>" (c'est assez bestial, mais cela suffit peut être) :
Code :
|
Marsh Posté le 20-01-2004 à 16:33:41
C'est un peu moins simple: Faut supprimer les <xxx y="mmm"> les <xxx y="mmm"/> les </xxx>, les processing instructions, les commentaires
Il faut ensuite translater les entites caractere quand on le peut vers le caractere ascii (Isolatin1? Unicode?) correspondant.
A+,
Marsh Posté le 20-01-2004 à 18:54:44
Bon, c'est pas du shell, mais si tu sais un peu coder le C:
- tu vas telecharger expat sur source forge (tu choisis le source unix ou pc selon tes besoins)
- tu lance l'auto configuration sous unix
- tu recompiles en faisant #undef sur les symboles XML_NS et XML_DTD (dans le fichier de config.h plateforme dependant, c'est lib/winconfig.h pour windows) ca fait un executable plus petit.
Si tout a ete ok jusque la (ca devrait), tu remplaces le fichier exemples/elements.c
Tu recompile l'executable correspondant, et tu obtient un exe qui fait ca et que tu peux adapter si besoin est (la je lui fait prendre un seul argument, le non du fichier a traiter, a toi de modifier ca selon ce qui t'arrange, et si la maniere dont les blancs sont geres ne te convient pas, tu peux modifier le code de characterData par exemple.
Code :
|
Tu peux ensuite ajouter un handler pour les debuts et fins de tag, pour mieux controller quand tu veux des sauts de ligne...
Un exemple de modification ou je vire tous les blancs, tabs, saut de ligne... et envoie des sauts de ligne pour chaque tag fermant:
Code :
|
A toi d'adapter selon tes besoins (decider d'envoyer ou pas un \n selon le nom du tag (pas pour des </b>, </i> par exemple) etc etc)
Tout ca devrait aussi pouvoir se coder assez facilement en perl, il y a un wrapper de expat en perl il me semble.
A+,
Marsh Posté le 20-01-2004 à 19:19:16
dit gilou vas faire un tour dans <ctype.h>
par contre pour ça
static void XMLCALL
characterData(void *userData, const char *s, int len)
{
if (len)
{
char *buf = malloc(len+1);
strncpy(buf, s, len);
buf[len] = 0;
fputs(buf, stdout);
free(buf);
}
}
ben faut pas voir peur ! un petit coup de fwrite peut faire du bon boulot (sauf emmerdemment sur système pourri)
fprintf(stdout, "\n" ); -> fputs('\n', stdout);
Marsh Posté le 20-01-2004 à 22:38:55
C'est quoi qui te defrise avec ces fputs?? une histoire de buffers flushés peut etre?
on va mettre fprintf(stdout, buf); a la place de fputs(buf, stdout); alors, et tout le monde sera content
Je vois pas l'interet de <ctype.h> ici, car je sais que les chaines retournées par expat sont en UTF-8 et donc pas dependant d'une locale ou un truc du meme tonneau. Bon d'accord on pourrait utiliser isspace, mais en l'occurence je suis pas certain que \f et \v doivent etre traites comme les autres.
Et puis je n'ai fait que donner qu'un exemple indicatif (d'ou mon emploi de fputs, le source original ayant puts, habituellement je reste fidele a fprintf )
A+,
Marsh Posté le 20-01-2004 à 22:53:44
non y a rien : mais vous oubliez trop que printf est mal nommée c'est un affichage formaté, donc si tu n'a pas d'arguments à formater tu as quand même un surcout, même inutile. y a des fonctions pour autant s'en servir
pour ctype -> si
Marsh Posté le 14-01-2004 à 17:56:58
Bonjour,
J'ai une montagne de taf là et on viens de me filer un script à faire. Problême, j'ai que trés, mais alors trés peu de notion de bash.
A votre avis c'est simple à réaliser ? Il s'agit d'enlever toutes les balises d'un fichier xml et de l'enregistrer au format ascii. Je dois faire ça pour plus +de 25000 fichiers alors si quelqu'un à déja vu ça ça me sauverait un peu.
Merci d'avance