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 :

parser un XML avec DOM minidom


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut parser un XML avec DOM minidom
    Bonjour a tous,

    Je cherche le moyen d'obtenir la liste des valeurs des attributs portant le nom par exemple 'extension' dans toutes les balises ayant pour nom 'fichier' par exemple.
    A ce jour je ne peux obtenir qu'une seule de ces valeurs en pointant sur un numero (dans le code qui suit [10]).
    Donc voici une partie de mon XML
    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
     <?xml version="1.0" ?>
    <!DOCTYPE racine
      SYSTEM 'racine.dtd'>
    <racine>
    	<repertoire cache="1" nom=".afterstep">
    		<repertoire nom="desktop">
    			<repertoire nom="fonts"/>
    			<repertoire nom="icons"/>
    			<repertoire nom="tiles"/>
    		</repertoire>
    		<repertoire nom="non-configurable">
    			<fichier extension="" nom="AfterStepCategories"/>
    			<fichier extension="" nom="GNOMECategories"/>
    			<fichier extension="" nom="KDECategories"/>
    			<fichier extension="" nom="OtherCategories"/>
    			<fichier extension=".sh" nom="send_postcard"/>
    			<fichier extension="" nom="workspace_state"/>
    et le code ou je parse mon xml afin d'en extraire ce dont j'ai besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from xml.dom import minidom
    xmldoc = minidom.parse('xmlFileSystem.xml')
    reflist = xmldoc.getElementsByTagName('fichier')
    bitref=reflist[10]
    a=bitref.attributes['nom']
    print a.value
    print bitref.toxml()
    Voilà si quelqu'un a une idée n'hesitez pas et merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Par défaut
    Bonjour,

    je lis plusieurs exemples sur les manipulations du dom, et de mon côté,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from xml.dom import minidom
    ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      File "/Users/fenhn/Documents/Informatique/python/beginning/dmxml.py", line 2, in <module>
    import xml
    J'ai cru lire que des éléments du SAX et du DOM avaient été rajoutées dans python, est ce qu'il y a un moyen de créer des xml juste avec le python installé de base ?

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Salut,

    pour ma part, je ne connais pour ainsi dire pas du tout ce package, ce qui ne m'empêche pas de voir une méthode pour résoudre ton besoin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import re
     
    def findall(tagname, attributename, line):
        pattern = '<%s.* %s="(.*?)"' % (tagname, attributename)
        matcher = re.compile(pattern)
        for match in matcher.search(line):
            yield match.group(1)

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    je peux te proposer de regarder du côté de la librairie non standard lxml. Cette dernière inclut le langage de requêtes XPath.

    tu auras juste donc à parser le fichier xml avec la librairie et à créer la requête XPath idoine.

    il y a un tuto là:

    http://codespeak.net/lxml/tutorial.html pour le parser
    http://codespeak.net/lxml/xpathxslt.html pour l'utilisation des requêtes XPath avec lxml

    un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from lxml import etree
    data="<racine><repertoire nom='toto'><fichier extension='.sh' nom='toto'/><fichier extension='.txt' nom='toto'/></repertoire></racine>"
    root = etree.fromstring(data)
    et la requête xpath qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root.xpath('//fichier/@extension')
    >>>['.sh', '.txt']
    de mon point de vue, c'est le plus simple. XPath n'est pas si compliqué à apprendre et te rendra bien des services en t'évitant d'écrire un code lourd pour extraire des données d'un arbre xml.

    petit déchiffrage de la requête XPath:

    - //fichier au début signifie que l'on cherche dans tout l'arbre les éléments de type 'fichier'
    - //fichier/@extension signifie que l'on cherche les attributs (préfixe @) de l'élément fichier).

    xPath renvoit systématiquement une liste de toutes les données correspondant à la requête.

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # tous les éléments repertoire dans la racine:
    root.xpath("/racine/repertoire") 
    #tous les élements repertoire (quelquesoit leur localisation dans la racine) dont l'attribut nom vaut "toto" les [ ] permettent de spécifier des conditions.
    root.xpath("//repertoire[/@nom='toto']")
    #tous les éléments repertoire vide (ne contenant aucun fichier):
    root.xpath("//repertoire[count(./fichier)=0]")
    c'est beau hein ?

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 708
    Par défaut
    Salut,

    tnntwister semble avoir à priori des problèmes "d'import"....
    • Quelle est la version de python utilisée?
    • Comment a-t-elle été installée?
    • ...

    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [DOM] Parser XML avec DOM
    Par webrider dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/01/2008, 12h45
  2. [DOM4J] Parser un document XML avec DOM
    Par kroax dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 23/11/2007, 01h48
  3. Parser un fichier XML avec DOM
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 02/11/2007, 20h44
  4. parser un fichier xml avec dom
    Par cilies38 dans le forum Modules
    Réponses: 2
    Dernier message: 04/03/2007, 21h12
  5. [DOM] [Débutant(e)] Modifier un fichier XML avec DOM
    Par macks dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 05/07/2005, 14h13

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