IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Remplacement du contenu de plusieurs balises XML


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Remplacement du contenu de plusieurs balises XML
    Bonjour,
    j'aimerai remplacer le contenu des balises <content>, dans le fichier suivant (extrait.xml), par des valeurs différentes (d'un compteur par exemple).

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <Document>
    	<Story>
    			<StoryPreference/>
    			<InCopyExportOption/>
    			<ParagraphStyleRange>
    				<CharacterStyleRange>
    					<Content>{Nom_produit}</Content>
    				</CharacterStyleRange>
    			</ParagraphStyleRange>
    	</Story>
    	<Story>
    			<StoryPreference/>
    			<InCopyExportOption/>
    			<ParagraphStyleRange>
    				<CharacterStyleRange>
    					<Content>{Prix_HT}</Content>
    				</CharacterStyleRange>
    			</ParagraphStyleRange>
    	</Story>
    	<Story>
    			<StoryPreference/>
    			<InCopyExportOption/>
    			<ParagraphStyleRange>
    				<CharacterStyleRange>
    					<Content>{Ref_produit}</Content>
    				</CharacterStyleRange>
    			</ParagraphStyleRange>
    	</Story>
    </Document>

    Je sais déjà récupérer le contenu de ces balises :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <html>
    <body>
     
    <p id="demo"></p>
     
    <script>
    var xhttp;
    xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            accesContenuBalise(this);
        }
    };
    xhttp.open("GET", "origine.xml", true);
    xhttp.send();
     
    function accesContenuBalise(xml) {
        var contenuBalise; 
        var i;
        var xmlDoc;
        var txt = "";
        xmlDoc = xml.responseXML;
        
        contenuBalise = xmlDoc.getElementsByTagName("Content");
        
        for (i = 0; i < contenuBalise.length; i++) { 
            txt += contenuBalise[i].childNodes[0].nodeValue + "<br>";
        }
        document.getElementById("demo").innerHTML = txt;
    }
    </script>
    </body>
    </html>

    Je possède également le code me permettant d'ouvrir et d'enregistrer mon fichier :

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // JavaScript File
     
     
    //fs comme filesystem pour Node
     
    var fs = require('fs');
     
    //lecture du xml
     
    var fichierAmodifier = fs.readFileSync('extrait.xml').toString();
     
    //remplacement du contenu
    var compteur = 1;
     
     
    //ecriture du nouveau fichier
     
    fs.writeFileSync('extrait2.xml', fichierAmodifier);

    Comment puis-je combiner les 2 pour :
    - ouvrir le fichier
    - récupérer le contenu des balises
    - remplacer le contenu de ces balises par les valeurs du compteur (1,2 et 3 ou plus pour un autre fichier plus long par exemple)
    - enregistrer le résultat dans un nouveau fichier

    Merci beaucoup de votre aide.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Ta demande n'est pas très claire:
    • S'agit-il d'un script Javascript dans une page html ou bien d'un script sur un serveur nodejs?
    • Où se trouve le fichier XML? (sur le serveur je présume, mais ça serait bien d'en être sûr.)
    • Où veux-tu l'enregistrer: en local ou sur le serveur?
    • Coté serveur: quel est le langage installé: php, nodejs, autre?


    Merci de répondre précisément à toutes ces questions.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Il s’agit d’un script sur un serveur nodejs.
    Le fichier XML est sur le serveur.
    Je veux l’enregistrer sur le serveur.
    L’ojectif est de tout réaliser uniquement en JavaScript.

    Merci.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Ok, alors soit de deux choses l'une:
    1. si ton fichier XML est en fait un simple template et que les placeholders entre accolades sont toujours au même endroit (ç-à-d entre les tags Content et pas ailleurs), tu peux ignorer le fait qu'il s'agisse de XML et faire un simple remplacement de texte:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      const fs = require('fs');
       
      var fichierAmodifier = fs.readFileSync('extrait.xml').toString();
       
      var compteur = 1;
      fichierAmodifier = fichierAmodifier.replace(/{[^}]*}/g, m => compteur++);
       
      fs.writeFileSync('extrait2.xml', fichierAmodifier);
    2. Si ce n'est pas le cas, tu dois utiliser un parser XML pour atteindre et modifier le texte des balises Content. Comme toujours avec nodejs, il y a je ne sais combien de modules permettant de faire ça. Exemple avec le module libxmljs:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      const fs = require('fs');
      const libxml = require("libxmljs");
       
      var xml = fs.readFileSync('extrait.xml').toString();
       
      var compteur = 1;
      var xmlDoc = libxml.parseXmlString(xml); 
       
      xmlDoc.find('//Content').forEach( elt => elt.text(compteur++) );
       
      fs.writeFileSync('extrait2.xml', xmlDoc.toString());


    Par contre je ne vois pas ce que le code html de ton premier post avec son appel ajax vient faire ici.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Merci CosmoKnacki,

    la solution 1 fonctionne bien mais je n'y arrive pas avec la 2 ("TypeError: libxmljs.parseXml is not a function").

    Pour ce qui est de l'html, c'était pour tester la récupération du contenu des <content> avec le getElementsByTagName("Content").
    y aurait-il moyen de l'utiliser et de trouver un autre moyen de remplacement du contenu?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Le souci avec la solution 1 est que je peux avoir des "{}" ailleurs que dans les balises <content>...

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    je n'y arrive pas avec la 2 ("TypeError: libxmljs.parseXml is not a function")
    As-tu installé libxmljs? À noter aussi que dans mon code je n'utilise pas de fonction parseXml mais bien parseXmlString.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Je suis pour l'instant sur cloud9 sous environnement nodejs.
    Comment puis-je y installer libxml.js?
    Pour info, j'avais bien mis parseXmlString mais le message d'erreur est bien "TypeError: libxmljs.parseXml is not a function".

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    J'en ai aucune idée je n'utilise pas cloud9, renseigne-toi auprès d'eux, ou mieux installe-toi un serveur nodejs en local.

Discussions similaires

  1. Tester le contenu textuel des balises XML?
    Par Marian83 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/04/2009, 12h34
  2. [RegEx] Remplacement du contenu d'une balise HTML
    Par Tchupacabra dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2008, 23h51
  3. [SimpleXML] Récupérer contenu d'une balise XML contenant du HTML
    Par samichon dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 24/08/2007, 08h36
  4. [AJAX] récupérer contenu d'une balise xml
    Par Braillane dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/06/2007, 08h08
  5. [xsl] mauvaise interprétation du contenu d'une balise XML
    Par Cédric B. dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/01/2006, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo