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

XML/XSL et SOAP Discussion :

Problèmes d'ajouts de noeuds dans un fichier xml avec python 2.7


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut Problèmes d'ajouts de noeuds dans un fichier xml avec python 2.7
    Bonjour à tous,

    Je souhaite ajouter automatiquement des nœuds dans un fichier xml et jusque là ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from lxml import etree as ET
     
    new_nodes=[["A",A1,"T17C"],["A1","A2", "C18T"],["A","A3","C745T"], ["A","A4", "C2215T"]] 
    tree=ET.parse("file.xml")
    root=tree.getroot()
     
    for i in tree.xpath("//Node"):
    	for j in new_nodes:
    		if j[0] == i.get("Id"):
    			i = etree.SubElement(hg, "Node")
    			i.set("Id", hg2[1])
    			i.set("HG", hg2[2])
    			tree.write("file.xml")
    Dans ce code je parcours mon fichier xml et ma variable: si la valeur new_nodes[0] est présente dans mon fichier xml, je crée après ce dernier un nouveau nœud avec les infos correspondantes aux positions 1 et 2 de ma liste.
    Le problème est quand la valeur de la position new_nodes[0] apparait 3 fois (ici "A"): le nouveau nœud va être crée la première fois que la valeur A est trouvée dans le fichier xml mais pas les suivantes.
    Je pense que cela vient du fait qu'une fois la valeur A est trouvée le premier nœud est crée et comme cette valeur apparaît qu'une fois dans le fichier XML, une fois que la boucle l'a passé elle ne revient pas en arrière pour créer les nouveaux nœuds qui contiennent cette même valeur.

    Si quelqu'un aurait une idée pour créer tous les noeuds dont la valeur "A" est trouvée dans fichier xml ça serait top.

    Merci par avance pour votre aide.
    Piotre

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Même c'est un petit démo pour montrer un problème spécifique, il faut quand même programmatiquement valable en lui-même : fonctionne mais tout à fait souhaité... Le script ne fonctionnerait pas du tout, je pense; donc, il ne démontre rien. 1) A2 sans guillemets; 2) "from lxml ... etree as ET" et etree continue d'être écrit au lieu de ET dans le script; 3) hg, hg2 ne sont pas définies... Si vous d'abord le soignez tout ça et montrez le démo corrigé qui marche (quoi que partiellement), on peut vous aider plus effectivement; et en plus, dans le procès de le faire soigner, c'est possible que vous pouvez même trouver sans effort la solution ...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    Bonsoir,

    Sincèrement désolé pour les erreurs et merci pour votre commentaire, vous avez bien raison.
    voilà les modifs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from lxml import etree as ET
     
    new_nodes=[["A","A1","T17C"],["A1","A2", "C18T"],["A","A3","C745T"], ["A","A4", "C2215T"]] 
    tree=ET.parse("file.xml")
    root=tree.getroot()
     
    for i in tree.xpath("//Node"):
    	for j in new_nodes:
    		if j[0] == i.get("Id"):
    			i = ET.SubElement(hg, "Node")
    			i.set("Id", j[1])
    			i.set("HG", j[2])
     			tree.write("file.xml")
    La solution est sûrement évidente mais je dois "beuger" ou être bien fatigué...
    Merci pour votre aide

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Si vous faites ça
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in tree.xpath("//Node"):
    	for j in new_nodes:
    		if j[0] == i.get("Id"):
    			k = ET.SubElement(i, "Node")
    			k.set("Id", j[1])
    			k.set("HG", j[2])
     			tree.write("file.xml")
    que trouvez-vous ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    Merci pour ton aide.

    Ca marche moyennement dans le sens ou si 2 "A" se suivent dans la liste le second n'est pas ajouté:

    new_nodes=[["A","A1","T17C"],["A1","A2", "C18T"],["A","A3","C745T"], ["A","A4", "C2215T"]]

    Ici ["A","A1","T17C"],["A","A3","C745T"] sont bien crées mais pas ["A","A4", "C2215T"]].
    Cela se répète des que plusieurs "A" se suivent dans les sous-listes...

    Peut-tu m'éclaircir sur le fait de changer la variable I en une nouvelle k change quelque chose?

    Merci beaucoup

  6. #6
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    [0]
    Peut-tu m'éclaircir sur le fait de changer la variable I en une nouvelle k change quelque chose?
    k dans la portée boucle-j est une référence de l'Elément ainsi crée nommé "Node" aussi comme enfant de l'élément i d'un nom "Node" (au lieu d'une indéfinie hg). Les lignes suivantes ajoutent les attributs désirée.

    [1]
    Ca marche moyennement dans le sens ou si 2 "A" se suivent dans la liste le second n'est pas ajouté
    Je ne peux pas confirmer ça. Je trouve tous les sous-éléments sont crées comme attendus.

    [2] Je propose aussi que tu nomme le fichier sorti différemment comme "file_out.xml" pour que le script s'est rendu idempotent. Dans l'original, il n'en est pas, si on l'exécute multiple fois, chaque fois le résultat se change... ça empêche qu'on voit plus clair plus facilement.

    [3] Qu'on mette le tree.write() hors la portée du boucle i. Comme ça, c'est plus efficace et on fait tree.write() une fois seulement: mais c'est juste une amélioration, la sortie n'est toujours pas comme tu décrit [1]

    [4] Si le fichier.xml est
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
        <Node Id="A"></Node>
        <Node Id="B"></Node>
        <Node Id="A1"></Node>
        <Node Id="D"></Node>
    </root>
    La sortie file_out.xml je trouve est
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
        <Node Id="A"><Node Id="A1" HG="T17C"/><Node Id="A3" HG="C745T"/><Node Id="A4" HG="C2215T"/></Node>
        <Node Id="B"/>
        <Node Id="A1"><Node Id="A2" HG="C18T"/></Node>
        <Node Id="D"/>
    </root>
    Comme tu peut te constater, tous les sous-éléments sont là.

    Voilà !

Discussions similaires

  1. Ajouter des noeud dans un fichier XML
    Par chinoismasque dans le forum Windows Phone
    Réponses: 4
    Dernier message: 02/08/2011, 16h32
  2. Ajouter un noeud dans un fichier XML
    Par rambc dans le forum Général Python
    Réponses: 4
    Dernier message: 05/05/2010, 13h55
  3. [PHP] Problème d'ajout d'attributs dans un fichier xml
    Par sismic dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 10/06/2009, 17h16
  4. Problème d'ajout de noeud dans un treeview
    Par kince dans le forum SharePoint
    Réponses: 1
    Dernier message: 01/06/2007, 13h51
  5. Problème d'ajout de noeud dans un treeview
    Par kince dans le forum VB.NET
    Réponses: 1
    Dernier message: 31/05/2007, 18h57

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