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

Python Discussion :

comment lire un noeud d'un XML [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2019
    Messages : 67
    Points : 44
    Points
    44
    Par défaut comment lire un noeud d'un XML
    bonjour,

    j'ai un fichier xml dont j'aimerai récupérer voir modifier les noeuds.
    par exemple dans le Group File Info j'aimerai modifier la valeur du password qui est actuellement ""
    et par exemple récupérer la valeur "Duration (no frames)" du group media info qui a comme valeur "26 mins.

    pour le moment j'arrive à afficher tout mon fichier mais je ne sais pas du tout comment faire sur ce type de fichier xml.

    je vous remercie pour votre aide.


    Code : 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
    from lxml import etree as ET
     
    XML = '''<?xml version='1.0' ?>
    <list>
        <CLIP title="test">
        <GROUP title="Media Info">
          <FIELD title="Duration" value="26 mins " />
          <FIELD title="Duration (short)" value="26m" />
          <FIELD title="Duration (no frames)" value="26 mins " />
          <FIELD title="Duration (TC)" value="00:26:00:00" />
          <FIELD title="Framerate" value="25" />
            <mode>auto</mode>
            <langue>francais</langue>
            </GROUP>
            <GROUP title="AAF info">
          <FIELD title="Content type" value="Composition" />
          <FIELD title="Total video edits" value="1" />
          <FIELD title="Total audio tracks" value="2" />
            </GROUP>
            <GROUP title="File Info">
          <FIELD title="password" value="" />
          <FIELD title="username" value="" />
            </GROUP>
        </CLIP>
    </list>'''
    root =ET.XML(XML)
    mode = root.findall('CLIP/GROUP/FIELD')
    print(mode)
     
    print (ET.tostring(root, xml_declaration=True, pretty_print=True))

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    J'y arrive de cette manière :

    Code : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #! python3
    # coding: utf-8
     
    from termcolor import cprint
    import xml.etree.ElementTree as ET
     
    XML = '''<?xml version='1.0' ?>
    <list>
        <CLIP title="test">
        <GROUP title="Media Info">
          <FIELD title="Duration" value="26 mins " />
          <FIELD title="Duration (short)" value="26m" />
          <FIELD title="Duration (no frames)" value="26 mins " />
          <FIELD title="Duration (TC)" value="00:26:00:00" />
          <FIELD title="Framerate" value="25" />
            <mode>auto</mode>
            <langue>francais</langue>
            </GROUP>
            <GROUP title="AAF info">
          <FIELD title="Content type" value="Composition" />
          <FIELD title="Total video edits" value="1" />
          <FIELD title="Total audio tracks" value="2" />
            </GROUP>
            <GROUP title="File Info">
          <FIELD title="password" value="" />
          <FIELD title="username" value="" />
            </GROUP>
        </CLIP>
    </list>'''
     
    root = ET.fromstring(XML)
     
    for child in root[0]: # CLIP
        cprint('''child tag = {}, child attribut = {}'''.format(child.tag, child.attrib), 'green')
     
    '''
    child tag = GROUP, child attribut = {'title': 'Media Info'}
    child tag = GROUP, child attribut = {'title': 'AAF info'}
    child tag = GROUP, child attribut = {'title': 'File Info'}
    '''
     
    for child in root[0][0]: # GROUP
        cprint('''child tag = {}, child attribut = {}'''.format(child.tag, child.attrib), 'green')
     
    '''
    child tag = FIELD, child attribut = {'title': 'Duration', 'value': '26 mins '}
    child tag = FIELD, child attribut = {'title': 'Duration (short)', 'value': '26m'}
    child tag = FIELD, child attribut = {'title': 'Duration (no frames)', 'value': '26 mins '}
    child tag = FIELD, child attribut = {'title': 'Duration (TC)', 'value': '00:26:00:00'}
    child tag = FIELD, child attribut = {'title': 'Framerate', 'value': '25'}
    child tag = mode, child attribut = {}
    child tag = langue, child attribut = {}
    '''
     
    attribut_dict = root[0][0][0].attrib
     
    for key, value in attribut_dict.items():
        cprint('''key = {}, value = {}'''.format(key, value), 'cyan')
     
    '''
    key = title, value = Duration
    key = value, value = 26 mins
    '''
     
    cprint(root[0][0][0].attrib['value'], 'red') # 26 mins

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2019
    Messages : 67
    Points : 44
    Points
    44
    Par défaut
    merci,
    est ce que je peux avoir des explications, car la je ne comprends pas tout
    d'autre part je n'ai pas la coloration syntaxique

    merci

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Dans mon code, je vous ai exposé toute ma démarche pour arriver à : print(root[0][0][0].attrib['value']), quoi dire de plus ?

    La documentation : https://docs.python.org/fr/3.7/libra...ementtree.html

    J'utilise toujours cprint au lieu de print pour avoir de la couleur dans la console.
    Il suffit de changer
    cprint('''child tag = {}, child attribut = {}'''.format(child.tag, child.attrib), 'green')en
    print('''child tag = {}, child attribut = {}'''.format(child.tag, child.attrib)).

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut xpath et attributs de nœuds
    Salut.

    Il est possible de spécifier les attributs de nœuds dans les requêtes xpath, c'est de la simple forme de node[@attr='value'].

    Alors, il est simple de faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # par exemple dans le Group File Info j'aimerai modifier la valeur du password qui est actuellement ""
    passwd_node = root.find('CLIP/GROUP/FIELD[@title="password"]')
    passwd_node.set('value', 'un_mot_de_passe')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # par exemple récupérer la valeur "Duration (no frames)" du group media info qui a comme valeur "26 mins
    duration_node = root.find('CLIP/GROUP/FIELD[@title="Duration"]')
    print('duration', duration_node.get('value'))
    Le temps ronge l'amour comme l'acide.

  6. #6
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Bonjour,

    il serais temps de laisser tomber xml.etree, c'est comme essayer de se branler avec des gants de box tout en récitant l'alphabet à l'envers (enfin ce n'est que mon opinion personnelle)

    Voici une solution simple avec BeautifulSoup
    Bien sur dans le cas où il fait traiter un énorme fichier il faudra faire un code bien plus conséquent une boucle for sur soup.findAll("CLIP")
    Code : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    >>> from bs4 import BeautifulSoup
     
    >>> XML = '''<?xml version='1.0' ?>
    <list>
        <CLIP title="test">
        <GROUP title="Media Info">
          <FIELD title="Duration" value="26 mins " />
          <FIELD title="Duration (short)" value="26m" />
          <FIELD title="Duration (no frames)" value="26 mins " />
          <FIELD title="Duration (TC)" value="00:26:00:00" />
          <FIELD title="Framerate" value="25" />
            <mode>auto</mode>
            <langue>francais</langue>
            </GROUP>
            <GROUP title="AAF info">
          <FIELD title="Content type" value="Composition" />
          <FIELD title="Total video edits" value="1" />
          <FIELD title="Total audio tracks" value="2" />
            </GROUP>
            <GROUP title="File Info">
          <FIELD title="password" value="" />
          <FIELD title="username" value="" />
            </GROUP>
        </CLIP>
    </list>'''
     
     
    >>> soup = BeautifulSoup(XML, "xml")
    >>> soup.find("FIELD", title="Duration (short)")
    <FIELD title="Duration (short)" value="26m"/>
    >>> soup.find("FIELD", title="Duration (short)")["value"]
    '26m'
    >>> soup.find("FIELD", title="password")["value"] = "toto"
     
    >>> soup
    <?xml version="1.0" encoding="utf-8"?>
    <list>
    <CLIP title="test">
    <GROUP title="Media Info">
    <FIELD title="Duration" value="26 mins "/>
    <FIELD title="Duration (short)" value="26m"/>
    <FIELD title="Duration (no frames)" value="26 mins "/>
    <FIELD title="Duration (TC)" value="00:26:00:00"/>
    <FIELD title="Framerate" value="25"/>
    <mode>auto</mode>
    <langue>francais</langue>
    </GROUP>
    <GROUP title="AAF info">
    <FIELD title="Content type" value="Composition"/>
    <FIELD title="Total video edits" value="1"/>
    <FIELD title="Total audio tracks" value="2"/>
    </GROUP>
    <GROUP title="File Info">
    <FIELD title="password" value="toto"/>
    <FIELD title="username" value=""/>
    </GROUP>
    </CLIP>
    </list>
     
    >>> str(soup)
    '<?xml version="1.0" encoding="utf-8"?>\n<list>\n<CLIP title="test">\n<GROUP title="Media Info">\n<FIELD title="Duration" value="26 mins "/>\n<FIELD title="Duration (short)" value="26m"/>\n<FIELD title="Duration (no frames)" value="26 mins "/>\n<FIELD title="Duration (TC)" value="00:26:00:00"/>\n<FIELD title="Framerate" value="25"/>\n<mode>auto</mode>\n<langue>francais</langue>\n</GROUP>\n<GROUP title="AAF info">\n<FIELD title="Content type" value="Composition"/>\n<FIELD title="Total video edits" value="1"/>\n<FIELD title="Total audio tracks" value="2"/>\n</GROUP>\n<GROUP title="File Info">\n<FIELD title="password" value="toto"/>\n<FIELD title="username" value=""/>\n</GROUP>\n</CLIP>\n</list>'
    comme on peux le voir il suffit après d'écrire soup dans un fichier/BytesIO/whatever
    si jamais, pip install bs4 lxml

  7. #7
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par flapili Voir le message
    il serais temps de laisser tomber xml.etree, c'est comme essayer de se branler avec des gants de box tout en récitant l'alphabet à l'envers (enfin ce n'est que mon opinion personnelle)
    En effet, c'est une opinion personnelle, pour ma part, je ne vois strictement aucun intérêt à utiliser beautifulsoup pour manipuler du xml, même lxml n'est pas nécessaire hormis certains cas plus avancés de choses que l'on ne peut faire nativement avec dom ou etree que python fournit dans la bibliothèque standard.
    Le temps ronge l'amour comme l'acide.

  8. #8
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Citation Envoyé par bistouille Voir le message
    je ne vois strictement aucun intérêt à utiliser beautifulsoup pour manipuler du xml [...] etree que python fournit dans la bibliothèque standard
    la simplicité et la puissance ? qu'en est t'il de etree quand on a un dictionnaire d'attribut qui doivent matcher ?


    concernant le fait qu'il soit dans la stdlib, en effet vu le peu d'utilisation de pip il est clair qu'utiliser des librairies non fournies dans stdlib est une idée saugrenue
    bon là je suis taquin je l'avoue à utiliser l'argumentaire de l'homme de paille

  9. #9
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2019
    Messages : 67
    Points : 44
    Points
    44
    Par défaut
    merci danielhagnoul,

    j'ai pris connaissance du lien, j'ai eu beaucoup de réponse a mes questions.
    je te remercie pour ton aide, effectivement je peux récupérer n'importe quelle valeur de n'importe quel nœud, c'est TOP.
    mais j'ai une question ,si je veux modifier une valeur d'un fichier XML(qui se situe dans un repertoire reseau(R:/xml)) et le le sauvegarder comment faire?
    car sur une valeur donnée j'ai fais un
    os.replace()
    puis un
    tree . write ( 'output.xml' )
    mais cela ne me donne rien de bon.

    merci

  10. #10
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Exemple (les chemins dépendant de la configuration sur mon ordinateur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #! python3
    # coding: utf-8
     
    import xml.etree.ElementTree as ET
     
    # ouvrir un fichier xml en lecture, fermeture automatique grâce à with
    with open('Tests/forum_dvp/country.xml', 'r', encoding='utf-8') as xml_file:
        xml_tree = ET.parse(xml_file)
        root = xml_tree.getroot()
        # sélectionne le neighbor 'Austria'
        neighbor = root.find('country/neighbor[@name="Austria"]')
        # modifie la direction
        neighbor.set('direction', 'S')
        # sauvegarde dans un nouveau fichier xml
        xml_tree.write('Tests/forum_dvp/new_country.xml', encoding='utf-8')

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/07/2008, 11h00
  2. Comment Lire une valeur à partir d'un fichier XML en C++?
    Par Hamdi Hedhili dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 13/12/2005, 10h09
  3. Réponses: 4
    Dernier message: 28/10/2005, 09h59
  4. Comment lire un fichier XML ?
    Par jeromelef dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2005, 15h52
  5. XSL ne parvient pas à lire les noeuds XML ??
    Par yahn dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2004, 19h29

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