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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    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 émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    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 émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    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 émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    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à !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    Par défaut
    Salut tsuji,

    Merci beaucoup pour tes conseils et l'optimisation du code.
    Mon erreur était toujours présente mais en changeant l'ordre de mes boucles imbriquées ça fonctionne. Je parcours d'abord ma variable puis le fichier xml et tout semble être rentrée dans l'ordre...

    Il me reste pas mal de fonction à créer pour terminer ce que je veux, je te tiens au courant et encore merci
    Piotre

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    Par défaut
    Re tsuji,

    aurais tu une idée pour écrire chaque nœuds à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <Node Id="A"><Node Id="A1" HG="T17C"/><Node Id="A3" HG="C745T"/><Node Id="A4" HG="C2215T"/></Node>
    pour avoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <Node Id="A">
       <Node Id="A1" HG="T17C"/>
       <Node Id="A3" HG="C745T"/>
       <Node Id="A4" HG="C2215T"/>
    </Node>
    j'ai essayé mais ça ne change rien...
    Si tu as une idée,

    Encore merci et en espérant que c'est la dernière fois que je te dérange
    Piotre

  9. #9
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Oui, ce sont des façons peut-on dire équivalentes d'écrire le même document xml. Mais hélas pour faire formater dans une autre façon, ce n'est pas toujours évident et besoin "beaucoup" de travail supplémentaire pour presque rien, mais je comprends...

    Si c'est vraiment nécessaire, je utilise une feuille xslt quelque peu statique travailleuse, nommée pour instance, _indenter.xsl.
    Code xslt _indenter.xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="*|@*|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="*|@*|text()|comment()|processing-instruction()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space()" />
    </xsl:template>
    </xsl:stylesheet>

    Mais, plus que rarement, l'instruction indent n'est mal implémentée dans la secteur du moteur xslt. C'est le cas pour libxml aussi. Pourtant, on profite quand même le bon fonctionnalité de xsl:strip-space. Par conséquence, je dois aussi accepter l'utilité de l'option pretty_print de lxml... pour en sortir completement. Voici ce qui remplace la ligne tree.write().
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #je replace la ligne dans la portée globale déjà
    #tree.write('file_out.xml')
    xslt=ET.parse('_indenter.xsl')
    transform=ET.XSLT(xslt)
    tree_tf=transform(tree)
    tree_tf.write('file_out.xml', pretty_print=True)
    Voilà !

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup, je ne connaissais pas (xsl) (je débute...) et sans ton aide ça aurait été long de trouver la solution..
    Comme tu l'a dit, c'est vrai que c'est une étape compliqué pour un seul retour à la ligne...
    Je vais regarder demain si cette fois mon output est accepté par le logiciel.

    Je te tiens au courant et encore merci

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