Java -> XML

Bonjour,

Je dois générer un fichier xml a partir un modèle sous TXT dont j’ai toutes les lignes de code. Dedans j’ai inserées des ##nomdevaleur## qui devront être remplacés par les valeurs de mon application java. Maintenant mon problème c’est que je vois pas comment dire a java de généré un fichier selon ce TXT et lu dire de remplacé les valeurs du genres :

##ville##
en
Paris

qqun a un exemple de synthaxe ou un site ou je peux me documenter ?

Un exemple de manipulation de chaînes en java?

ben je comprends pas trop ce que tu me demandes mais la j’ai les valeurs dans des string ou int si nombre. Mon programme fonctionne assez bien car je peux générer un fichier TXT qui contient les valeurs.

Mais le modèle du document XML (ce sera pour un import dans un autre programme) contient 500 lignes de code et pour être sur de la compatibilité je préfère pas trop manipuler le code. Ensuite je me vois mal faire 500 lignes de out sous java avec des concatenations.

C’est pour ça que j’avais pensé faire ce genre de modèle ou il suffirait de générer un document sur la base de l’autre et remplacer le ##truc## par la valeur.

C’est de la manipulation de chaîne…

int indexDebut = maChaine.indexOf("##");
while (indexDebut != -1) {
  int indexFin = machaine.indexOf("##", indexDebut+1);
  // Penser a ajouter un controle sur l'indexFin ( != -1)
  String valeur = maChaine.substring(indexDebut+2, indexFin);
  maChaine = maChaine.substring(0, indexDebut)+trucPourTrouverMaValeur.get(valeur)+maChaine.substring(indexFin+2);
  indexDebut = maChaine.indexOf("##");
}

Salut dredre,

Le meilleur moyen de faire de la manip de fichier, c’est de faire un analyseur lexical suivi d’un analyseur syntaxique qui analyse ton fichier texte et remplace ton ##ville## par ce qu’il faut quand il tombe dessus.
Evidemment, c’est un peu technique si on connaît pas la théorie des langages et si on sait pas faire une grammaire, donc vu que je ne connais pas ton niveau, je dis quand même, mais sinon laisse tomber. Mais c’est vraiment le plus efficace du niveau des perfs. Et c’est très évolutif!
Si tu veux des renseignements sur comment on fait ça (Flex et Bison sont les logiciels les plus simples pour ça) je suis là.

PS : peut-être que je poste un peu tard, désolé…

johndoe5e13 -> La bombe atomique est probablement le meilleur des anti-moustiques…

Si j’ai bien compris le post de dredre (Je peux être à côté de la plaque), il a l’ensemble des valeurs a insérer (on va dire sous une forme clé=valeur)

et une base de document où il suffit de remplacer ##clé## par valeur

Flex? Bison? Solution la plus performante? La plus flexible?

Quel épisode ai-je raté?

(y a un truc sidérant quand même, c’est que les cafards résistent à la bombe atomique!)

Sans avoir tout lu, soit tu ouvres tout ton fichier dans une chaîne (façon Barbarian) et tu fais un replace (la méthode doit exister dans la classe String). Soit tu utilises un moteur de template (je sais pas si ça existe en kawa, mais qui sait?).

En tout cas, un analyseur syntaxique et lexical pour remplacer des couples clefs valeurs… c’est stupide.

Ah par contre, tu peux aussi tenter Sax pour justement faire des remplacements dans toutes les chaînes CDATA (ou mieux: tu crées ton propre tag ).

là je comprends plus! Bombe atomique? Lex et Yacc? C’est des vieux logiciels poussiéreux…mais qui font très bien et très facilement ce pour quoi ils sont conçus!
La solution que j’ai donnée ça prend à peu près 15mn à faire et ça évite d’aller se faire ch… avec des manips de fichiers et de chaînes de caractères. De toutes façons, quelle que soit la façon dont on appelle ça, ça sera quand même de l’analyse lexicale et syntaxique, même si c’est assez simple et fait à la barbare. Alors pourquoi ne pas faire ça de façon un peu classe et rapide?

Maintenant si quelqu’un peut m’expliquer en quoi 20 lignes de texte ça fait une bombe atomique, j’écoute…

Tout simplement parce que c’est inadapté peut être? (même si un bon flex :))

Il demande un truc en java… donc propose lui un flex version java?

C’est une question de point de vue. Je pense que c’est le mot analyse qui fait peur, alors qu’en fait ça fait moins de boulot que de se payer des manips de fichiers et de chaînes. Perso je fais toutes mes manips de fichiers avec flex et bison et c’est vraiment hyper rapide. Alors pour une grammaire qui doit faire à peu près 2 lignes, c’est vraiment histoire d’un quart d’heure!
Mais je veux bien admettre que c’est inadapté, mais POURQUOI? Si c’était un boulot démesuré je veux bien, mais c’est pour gagner du temps!

Par contre j’avoue que j’ai pas fait gaffe à la portabilité…

La solution que j’ai proposée (La version barbare un peu plus haut) te paraît si compliquée que ça?
2 minutes de programmation et un traitement au moins aussi rapide que dans ta solution, même dans la version ‘light’ que j’ai mise en ligne

myself> nope, avec flex c’est plus rapide :slight_smile: ta solution c’est je trouve #www# je remplace, je passe à #xxx#

avec flex, c’est vraiment tout con :

[cpp]"#www#" { print_var( “www” );}
#xxx#” { print_var( “www” );}[/cpp]

(plus les %%)

Et ça devrait afficher la bonne chose, sauf que FLEX n’existe pas en Java (ou y a des équivalents mais dans ce cas johndoe5e13 fournis les).

Quand on te demande de bosser en X, c’est pas pour le faire en Y. Logique non?

C’est en ça que c’est inadapté.

C’est sûr c’est pas très long, mais, aucun contrôle d’erreur, pas terminé (il manque trucPourTrouverMaValeur.get(valeur) même si c’est pas bien long à faire, à moins qu’il y ait pas mal de types de valeurs à insérer), et tu pars du principe que tout est déjà prêt, la chaîne créée et récupérée dans le fichier qu’on a déjà ouvert, et ensuite il faut réécrire la chaîne modifiée dans un fichier aussi.
C’était plutôt ça que je trouvais barbare.
Dans yacc, la gestion de fichiers se limite à ça :
FILE *fichierenentree = fopen(“MonFichier1”, “r”);
FILE *fichierensortie = fopen(“MonFichier2”, “w”);
yyin = fichierenentree;
yyout = fichierensortie;
Et pas besoin d’aller récupérer de chaîne ni rien, tout se fait tout seul.

Pas faux. Mais rien n’empêche de faire un petit appel de fonction externe non? A moins de vouloir la portabilité…
Je me suis dit que peut-être il était en Java, alors il a parlé de Java, sans forcément penser à autre chose…
Mais avoues que le titre du message fait furieusement penser à ma solution, c’est normal d’y avoir pensé en premier.

OK… trucPourTrouverMaValeur -> Hashtable ou Hashmap, mais je préférais trucPourTrouverMaValeur au cas où Dredre utilise un objet exotique

FileInputStream et FileOutputStream pour les entrees/sorties, je ne les ai pas mis car la question portait sur le remplacement de chaînes… On rajoute 3 lignes devant, 3 lignes derrière

Je reste convaincu que la solution est rapide a implémenter, et rapide lors des traitements

Que penseriez-vous d’effectuer un test comparatif?

Je connais pas… Ca fait quoi?

Et au passage, faut dire qu’il se fait pas chier hein :slight_smile:

il aurait pu définir des entités (&xxx;) et puis utiliser l’api java xml :slight_smile: elle permet de déclencher un événement à chaque entité rencontré :o (je viens de tilter)