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 :

Utilisation de DOM pour fichiers xml


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut Utilisation de DOM pour fichiers xml
    Bonjour,
    J'ai parcouru la doc de DOM http://docs.python.org/library/xml.dom.html pour manipuler les fichiers XML. J'ai encore des lacunes.
    Par rapport à l'exemple suivant, comment distinguer les vrais feuilles (en mon sens) qui sont entre tags (comme KK encadré par <aixm:gml:pos>) et celles qui n'en sont pas (comme les espaces encadrés par <aixm:ElevatedPoint>).
    Ensuite comment modifier une valeur fournie par node.nodeValue, je ne vois que des méthodes pour agir sur des noeuds, moi je veux garder les mêmes noeuds mais changer leur valeur.
    Merci de vos éclaircissements

    Fichier xml suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <message:AIXMBasicMessage xmlns:message="A" xmlns:aixm="B" xmlns:gml="C"  gml:id="I">
    	<aixm:ElevatedPoint srsDimension="2" gml:id="JJ">
    		<gml:pos srsDimension="3">KK </gml:pos>
    		<aixm:elevation uom="M">LL</aixm:elevation>
    	</aixm:ElevatedPoint>
    </message:AIXMBasicMessage>
    et le pg python 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
    class Application__:
    	def __init__(self):
    		datasource = open("Exec/test.xml")
    		dom = parse(datasource)
    		l = dom.documentElement
    		self.next(l.childNodes)
     
    	def next(self,l):
    		for node in l:
    			if node.nodeValue != None:
    				print "nodeName : ",node.parentNode.nodeName," nodeValue : <",node.nodeValue," >"
    			if node.hasAttributes() == 1:
    				for attrEntry in node.attributes.items():
       					print "    node : ",node.nodeName,"  attributes : ",attrEntry[0],attrEntry[-1]
    			if node.childNodes != []:	
    				self.next(node.childNodes)
    J'obtiens alors les traces suivantes:
    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
    nodeName :  message:AIXMBasicMessage  nodeValue : < 
            >
        node :  aixm:ElevatedPoint   attributes :  gml:id JJ
        node :  aixm:ElevatedPoint   attributes :  srsDimension 2
    nodeName :  aixm:ElevatedPoint  nodeValue : < 
                    >
        node :  gml:pos   attributes :  srsDimension 3
    nodeName :  gml:pos  nodeValue : < KK  >
    nodeName :  aixm:ElevatedPoint  nodeValue : < 
                    >
        node :  aixm:elevation   attributes :  uom M
    nodeName :  aixm:elevation  nodeValue : < LL >
    nodeName :  aixm:ElevatedPoint  nodeValue : < 
            >
    nodeName :  message:AIXMBasicMessage  nodeValue : < 
    >

  2. #2
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Pour remplacer une valeur encadré par un tag, ici LL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <aixm:elevation uom="M">LL</aixm:elevation>
    j'ai trouvé que l'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if node.parentNode.nodeName == "aixm:elevation":
         node.nodeValue = "LLLLLLLLLL"
    par contre pour changer la valeur d'un attribut (remplacer M par une autre valeur), je ne trouve pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <aixm:elevation uom="M">
    Merci

  3. #3
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour awalter1

    voici comment changer un attribut

    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
     
    from xml.dom.minidom import parse
     
     
    # Creation du document a.xml
    if not "Je veux creer le fichier a.xml" :
        f = open( 'a.xml', 'w' )
        f.write( """
        <root>
            <un_noeud un_attribut="M" />
        </root> """)
        f.close()
     
     
    doc = parse('a.xml' )
    noeud = doc.getElementsByTagName( 'un_noeud' )[0]
    print noeud.getAttribute('un_attribut')
    noeud.setAttribute('un_attribut', 'L')
    print noeud.getAttribute('un_attribut')

    Bonne journée
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  4. #4
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci beaucoup, je tournais en rond pourtant j'étais pas loin ...
    Il me reste à savoir comment distinguer les deux cas suivants:
    le cas ou un tag (ici aixm:ElevatedPoint) n'encadre pas de valeurs mais seulement d'autres tags :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <aixm:ElevatedPoint>
    	<aixm:elevation>LL</aixm:elevation>
    </aixm:ElevatedPoint>
    et le cas ou un tag (ici aixm:elevation) encadre une vrai valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <aixm:elevation>LL</aixm:elevation>
    Merci

  5. #5
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Je ne pense pas que ça soie possible, en fait une "vraie valeur" est aussi un noeud
    Tu peux savoir que c'est un noeud de type texte au moment où tu le tiens avec
    nodeType et les constante proposée dans le classe Node.

    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
     
    from xml.dom.minidom import parse
    from xml.dom import Node
     
     
    # Creation du document a.xml
    if not "Je veux creer le fichier a.xml" :
        f = open( 'a.xml', 'w+' )
        f.write( "<root>"                 )
        f.write(     "<un_sous_noeud>"    )
        f.write(       "un noeud texte"   )
        f.write(     "</un_sous_noeud>"   )
        f.write(     "<un_sous_noeud>"    )
        f.write(         "<un_noeud_vide />"   )    
        f.write(     "</un_sous_noeud>"   )
        f.write( "</root>"                )
        f.close()
     
    doc = parse('a.xml' )
     
    def my_parse( noeud ) :
        if noeud.nodeType == Node.TEXT_NODE :
            print noeud.nodeValue
        for child in noeud.childNodes :
            my_parse( child )
     
    root_node = doc.documentElement
    my_parse( root_node )
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

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

Discussions similaires

  1. [XSD] Utiliser plusieurs schémas pour un XML
    Par baygz dans le forum Valider
    Réponses: 1
    Dernier message: 31/07/2006, 16h03
  2. Modules pour fichiers XML volumineux
    Par contexte dans le forum Modules
    Réponses: 1
    Dernier message: 04/05/2006, 07h39
  3. [DOM] Problème avec DOM pour le XML...
    Par Julien_riquelme dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 02/03/2006, 14h51
  4. [DOM] Serialiser arbre DOM en fichier XML
    Par Overflow64 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/10/2004, 11h53
  5. [Kylix] Composant IBM pour fichiers XML
    Par Mister Nono dans le forum EDI
    Réponses: 1
    Dernier message: 29/09/2002, 20h28

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