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 :

Problème affichage namespace avec lxml


Sujet :

Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Ingénieur hydrographe
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur hydrographe

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Problème affichage namespace avec lxml
    Bonjour, je viens de commencer à développer en Python et je ne suis pas une experte non plus en xml.

    J’ai des problèmes avec l’utilisation de la librairie lxml et la gestion des namespaces.

    Je cherche à modifier le fichier xml suivant:
    Nom : xml_orig.png
Affichages : 622
Taille : 6,8 Ko


    Je souhaite obtenir le xml ci-dessous
    Nom : xml_obj.png
Affichages : 607
Taille : 10,3 Ko


    Pour cela j’utilise le code suivant:
    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
    from lxml import etree as ET
     
    parser = ET.XMLParser(remove_blank_text=True)
    tree = ET.parse('namespace.xml',parser)
    root = tree.getroot()
     
    child1 = root.find('.//{http://www.isotc211.org/2005/gmd}child1')
    parent = child1.getparent()
    id = root.index(child1)
     
    child2 = ET.Element('{http://www.isotc211.org/2005/gmd}child2', nsmap = {'srv':'http://www.isotc211.org/2005/srv'})
    child_child2 = ET.SubElement(child2,'{http://www.isotc211.org/2005/gco}CharacterString')
    child_child2.text = 'text'
     
    parent.insert(id+1,child2)
     
    ET.ElementTree(root).write('namespace2.xml', pretty_print = True)
    Nom : code_xml.png
Affichages : 906
Taille : 18,3 Ko


    Le problème est que je n’arrive pas à faire afficher le namespace spécifié dans le code dans le fichier xml de sortie. J’obtiens le résultat suivant :
    Nom : xml_res.png
Affichages : 590
Taille : 9,1 Ko


    Je ne sais pas si c’est pertinent, dans le code, de définir un namespace à « child2 » sachant qu’il l’a déjà hérité de « parent ».

    Mais comment faire afficher le namespace voulu dans la balise « child2 » ?
    Avez-vous des idées ?

    Merci beaucoup de votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Si tu veux ajouter un élément en fin de liste, c'est pas insert qu'il faut utiliser, mais append.

    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
    from lxml import etree as ET
     
    file_xml = './namespace.xml'
    file_new_xml = './namespace_2.xml'
     
    parser = ET.XMLParser(remove_blank_text=True)
    tree = ET.parse(file_xml,parser)
    root = tree.getroot()
     
    child1 = root.find('.//{http://www.isotc211.org/2005/gmd}child1')
    parent = child1.getparent()
    #id_ = root.index(child1)
     
    child2 = ET.Element('{http://www.isotc211.org/2005/gmd}child2', nsmap = {'srv':'http://www.isotc211.org/2005/srv'})
    child_child2 = ET.SubElement(child2,'{http://www.isotc211.org/2005/gco}CharacterString')
    child_child2.text = 'text'
     
    parent.append(child2)
     
    ET.ElementTree(root).write(file_new_xml, pretty_print = True)
    Il faut aussi éviter d'écraser les fonctions de bases python, id en est une.

    EDIT :

    En fait ton problème n'en est pas un.
    Tu cherches à définir un namespace qui est déjà définit par le root dans ton xml.
    Donc etree fait bien son boulot en repérant et supprimant ceux qui n'ont aucun intérêt d'exister puisque c'est implicite.

    Il suffit de changer l'url, en en mettant une différente, alosr là, cela fonctionne très bien.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Candidat au Club
    Femme Profil pro
    Ingénieur hydrographe
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur hydrographe

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut [Python 3.X] Problème affichage namespace avec lxml
    Bonjour bistouille,

    merci beaucoup pour tes conseils.

    Cependant, je ne vois pas ce qur tu veux dire par "changer l'url", j'ai besoin d'avoir le namespace 'srv':'http://www.isotc211.org/2005/srv' qui s'affiche et pas un autre. Comment faire?

  4. #4
    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
    Considère qu'un sous élément d'un élément ayant définit un namespace héritera (pour simplifié) du même namespace, un exemple étant plus parlant pour comprendre, teste ceci :

    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
    from lxml import etree as ET
     
    parser = ET.XMLParser(remove_blank_text=True)
    tree = ET.parse('./namespace.xml', parser)
    root = tree.getroot()
     
    child2 = ET.Element('{http://www.isotc211.org/2005/gmd}child2') # Pas de nsmap
    child_child2 = ET.SubElement(child2, '{http://www.isotc211.org/2005/gco}CharacterString')
    child_child2.text = 'noeud n°2'
    root.append(child2)
     
    child3 = ET.Element('{http://www.isotc211.org/2005/gmd}child2', nsmap = {'srv':'http://une_autre_url_que_le_root.truc'})
    child_child3 = ET.SubElement(child2, '{http://www.isotc211.org/2005/gco}CharacterString')
    child_child3.text = 'noeud n°3'
    root.append(child3)
     
    print('nsmap root')
    print(root.nsmap)
     
    print('srv child2')
    print(child2.nsmap['srv'])
     
    print('srv child3')
    print(child3.nsmap['srv'])
    Ce n'est qu'un exemple, car il vaut mieux éviter je pense de redéfinir un namespace déjà défini plus haut dans l'arborescence
    Le temps ronge l'amour comme l'acide.

  5. #5
    Candidat au Club
    Femme Profil pro
    Ingénieur hydrographe
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur hydrographe

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut [Python 3.X] Problème affichage namespace avec lxml
    Bonjour bistouille,

    je suis d'accord avec toi qu'il faut éviter de redéfinir un namespace déjà défini plus haut dans l'arborescence. Mais dans ce cas, comment le faire apparaître dans le xml sans le redéfinir?

    Nom : xml_obj.png
Affichages : 553
Taille : 10,3 Ko

    Merci beaucoup

  6. #6
    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,

    Pourquoi veux-tu persister à vouloir afficher dans ton élément ce namespace ?

    Avec etree, de toute façon, ça n'a pas l'air d'être possible à l'enregistrement, puis surtout ça ne sert à rien de s'évertuer à résoudre un non-problème.

    Alors soit tu essaies de trouver une bibliothèque xml qui permettrait cela, soit tu édites ton fichier en mode normal, et tu t'amuses avec des expressions régulières pour y ajouter ton namespace doublonné.

    Bon courage.
    Le temps ronge l'amour comme l'acide.

  7. #7
    Candidat au Club
    Femme Profil pro
    Ingénieur hydrographe
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur hydrographe

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut [Python 3.X] Problème affichage namespace avec lxml
    Merci beaucoup pour le conseil

Discussions similaires

  1. Problème affichage tableau avec Chrome 2
    Par Erazion dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 27/05/2009, 09h53
  2. problème affichage image avec NO-REPEAT
    Par nicomax34 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 19/03/2009, 09h02
  3. Problème affichage subreport avec paramètre
    Par gamma dans le forum iReport
    Réponses: 6
    Dernier message: 12/04/2007, 14h54
  4. [MySQL] problème affichage image avec sql
    Par igaurillac dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/02/2007, 18h04
  5. Problème affichage form avec Internet Explorer dans un menu
    Par dupard2006 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/03/2006, 19h26

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