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 :

Extraire des données XML


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    dev
    Inscrit en
    Avril 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 174
    Points : 110
    Points
    110
    Par défaut Extraire des données 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <TOP-LEVEL-PACKAGES>
        <AR-PACKAGE>
          <SHORT-NAME>Interfaces</SHORT-NAME>
          <ELEMENTS>
            <DATA-CONSTR>
              <SHORT-NAME>DONNEE 1</SHORT-NAME>
              <DATA-CONSTR-RULES>
                <DATA-CONSTR-RULE>
                  <PHYS-CONSTRS>
                    <LOWER-LIMIT INTERVAL-TYPE="CLOSED">0</LOWER-LIMIT>
                    <UPPER-LIMIT INTERVAL-TYPE="CLOSED">7</UPPER-LIMIT>
                  </PHYS-CONSTRS>
                </DATA-CONSTR-RULE>
              </DATA-CONSTR-RULES>
            </DATA-CONSTR>
            <DATA-CONSTR>
              <SHORT-NAME>DONEE2</SHORT-NAME>
              <DATA-CONSTR-RULES>
                <DATA-CONSTR-RULE>
                  <PHYS-CONSTRS>
                    <LOWER-LIMIT INTERVAL-TYPE="CLOSED">0</LOWER-LIMIT>
                    <UPPER-LIMIT INTERVAL-TYPE="CLOSED">4</UPPER-LIMIT>
                  </PHYS-CONSTRS>
                </DATA-CONSTR-RULE>
              </DATA-CONSTR-RULES>
            </DATA-CONSTR>
    Bonjour Voici un fichier xml ressemble a celui que je doit traiter, j'ai essayer au début le module LXML mais j'ai eu des difficultés, mnt j'utilise la librairie standard XML, je veux extraire le text "DONNEE" et les veleurs de "UPPER" et "LOWER" donc j'aai essayer d'extraire les child de <DATA-CONSTR>
    mais sa ne marche pas, voici une partie de code que j'ai fait:
    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
    import xml.dom.minidom as minidom
     
    #----------------------------------------------------------------------
    def getTitles(xml):
     
        """
        Définir toutes les entrées déclarer dans le fichier arxml
        """
        global liste_in
        liste_in=[]
        doc = minidom.parse(xml)
        node = doc.documentElement
        ports = doc.getElementsByTagName("R-PORT-PROTOTYPE")
     
        titles = []
        for port in ports:
            titleObj = port.getElementsByTagName("SHORT-NAME")[0]
            titles.append(titleObj)
     
        for title in titles:
            nodes = title.childNodes
            for node in nodes:
                if node.nodeType == node.TEXT_NODE:
                    print node.data
                    node.data = str(node.data)
                    liste_in.append(node.data)
        print liste_in
    if __name__ == "__main__":
        document = ('C:/Users/ARE/Desktop/FIC.arxml')
        getTitles(document)
    j'arrive a extraire le nom, mais je veux extraire les 3 ensemble, et il ya plus de 500 d'autre parties dans le fichier xml, avec le même ordre.
    merci par avance

  2. #2
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Je récapitule:


    1. Tu veux extraire le texte "DONNEE" du node <SHORT-NAME>
    2. Tu veux aussi extraire les valeurs de LOWER-LIMIT & UPPER-LIMIT du même parent <DATA-CONSTR>

    Questions:
    Ton fichier est-il gros ?
    Pourquoi lxml ne marchait pas ? Je pense que cette librairie est meilleure. Sinon tu as la 4suite.

    J'analyse un peu ton code et dis-moi si je me trompe, ce que tu veux faire:

    Pour chaque "port" trouvé
    Prendre le premier SHORT-NAME.
    FinPour
    Pour chaque shortname trouvé (title)
    Extraire la donnée brute
    FinPour

    Tu devrais plutôt essayer cela pour récupérer tes 3 valeurs d'un coup (code non testé !!!):
    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
     
    # Récupérer tous les DATA-CONSTRUCT
    l_dataConstruct = doc.getElementsByTagName("DATA-CONSTRUCT")
     
    # Pour chaque DATA-CONSTRUCT
    for DC in l_dataConstruct:
         # Prendre le premier SHORT-NAME sous le DC en cours 
         e_ShortName = DC.getElementsByTagName("SHORT-NAME")[0]
     
         # Prendre le premier de chaque x-LIMIT
         e_lowerLimit = DC.getElementsByTagName("LOWER-LIMIT")[0]
         e_upperLimit = DC.getElementsByTagName("UPPER-LIMIT")[0]
     
         # Extraire le texte de la valeur de e_ShortName
          vShortName = e_ShortName.nodeValue()
     
          # Extraire la valeur de l'attribut de e_lowerLimit
          vLowerLimit = e_lowerLimit.getAttribute("INTERVAL-TYPE")
     
          # Extraire la valeur de l'attribut de e_upperLimit
          vUpperLimit = e_upperLimit.getAttribute("INTERVAL-TYPE")
     
          # traiter ces valeurs...
          functionX(vShortName, vLowerLimit, vUpperLimit)

  3. #3
    Membre régulier
    Homme Profil pro
    dev
    Inscrit en
    Avril 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 174
    Points : 110
    Points
    110
    Par défaut
    Merci pour votre réponse, pour vos questions c'est exactement se que je veux faire récupirer le text de Short name et les 2 valeurs de upper et lower
    pour Lxml c'est moi qui n'a pas pu le faire enfin j'ai pas trouver comment le faire. et pour mon fichier il est a 11778 ligne.
    Merci encore

  4. #4
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    De rien

    D'expérience, minidom peine pour les gros fichiers. C'est pour ça que je préfère utiliser lxml ou 4suite.

    L'algorithme reste le même. Il faudra simplement adapter avec les syntaxes particulières et même mieux, faire du XPATH: (voir la doc sur ce site)

    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 = """ <ham> <eggs n='1'/> This is the string content with <em>emphasized text</em> text </ham>"""
     
    from Ft.Xml import Parse 
    from Ft.Xml.XPath.Context import Context 
    from Ft.Xml.XPath import Evaluate
     
    doc = Parse(XML) 
    ctx = Context(doc) 
    nodes = Evaluate(u'//em', ctx)  
     
    # The return value, a node set, comes back as a Python list of nodes 
    # which may be accessed using an iterator 
    for n in nodes:     
         # print dir(n)     
         print n.tagName     
         print n.firstChild.nodeValue

Discussions similaires

  1. Extraire des données d'un fichier XML
    Par ultimate_manx dans le forum XML
    Réponses: 1
    Dernier message: 28/11/2007, 19h03
  2. Réponses: 4
    Dernier message: 17/01/2007, 10h09
  3. extraire des données d'un doc pas tout a fait xml
    Par chrix10.2 dans le forum Général Python
    Réponses: 1
    Dernier message: 21/12/2006, 19h59
  4. Réponses: 2
    Dernier message: 20/10/2006, 11h49
  5. [xml] comment extraire des donnés xml
    Par Lodos dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 20/04/2006, 22h47

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