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 :

Python 2.6.6 XML et attribut xmi:id =


Sujet :

Python

  1. #1
    Membre régulier Avatar de bmayer
    Inscrit en
    Décembre 2003
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 153
    Points : 79
    Points
    79
    Par défaut Python 2.6.6 XML et attribut xmi:id =
    Bonjour

    Depuis quelques jours je bute sur un problème, malgré ce que je peux lire et (essayer) de comprendre.
    Un fichier XML en entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.1" encoding="UTF-8"?>
    <com.ibm.datastage.ai.dtm.ds:DSJobDefSDO xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:com.ibm.datastage.ai.dtm.ds="http:///com/ibm/datastage/ai/dtm/ds.ecore" xmi:id="134" lastModificationTimestamp="2017-03-16T16:02:09.748+0100" ...>
        <contains_JobObject xsi:type="com.ibm.datastage.ai.dtm.ds:DSLinkSDO" xmi:id="10" creationTimestamp="2017-03-16T15:06:33.999+0100" ...>
            <contains_FlowVariable xsi:type="com.ibm.datastage.ai.dtm.ds:DSFlowVariableSDO" xmi:id="100"  creationTimestamp="2017-03-16T15:06:33.999+0100" ...>
            </contains_FlowVariable>
        </contains_JobObject>
    </com.ibm.datastage.ai.dtm.ds:DSJobDefSDO>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import xml.etree.cElementTree as ET
    tree = ET.parse(<le nom complet du fichier)
    root = tree.getroot()
    print(root.get('creationTimestamp')) # No problemo
    for parent in tree.findall('.//contains_JobObject') :
        print(parent.get('creationTimestamp')) # No problemo
        for node in parent.findall('./contains_FlowVariable') :
            print(node.get('creationTimestamp')) # No problemo
    Je récupère bien la valeur d'un attribut par son nom comme "creationTimestamp".
    Toutefois, c'est là qu'est l'os, je voudrais aussi la valeur de xmi:id
    J'en suis à me dire que je vais sérialiser le fichier dans une string (500 fichiers de ~250Ko..) et remplacer chaque "xmi:id" par "xmi_id", mais je ne trouve pas cela très ... ce que vous voulez.

    Quelqu'un aurait-il l'amabilité de m'indiquer comment résoudre cela, comme cela se doit d'être fait avec les libs de base ?
    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Salut,

    Après avoir afficher les nom, valeurs des attributs:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for name, value in parent.attrib.iteritems():
            print name, value

    il semblerait que xmi:id est un alias pour {http://www.omg.org/XMI}id

    et en utilisant la verison longue, ça marche :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    print(parent.get('{http://www.omg.org/XMI}id'))

    je ne sais pas si c'est LA solution

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    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 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par DonKnacki Voir le message
    je ne sais pas si c'est LA solution
    Pour construire une solution, il faut commencer par lire la documentation concernant le parsing des fichiers XML avec des namespaces. Il y a un chapitre entier la dessus avec des exemples.

    - W

  4. #4
    Membre régulier Avatar de bmayer
    Inscrit en
    Décembre 2003
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 153
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    il faut commencer par lire la documentation concernant le parsing des fichiers XML avec des namespaces. Il y a un chapitre entier la dessus avec des exemples
    Hormis que j'avoue avoir du mal à comprendre, et du mal à transposer...

  5. #5
    Membre régulier Avatar de bmayer
    Inscrit en
    Décembre 2003
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 153
    Points : 79
    Points
    79
    Par défaut
    Transposer / transpirer, ça se ressemble !
    Bon, j'ai donc créer une structure de données pour référencer le namespace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ns = {'omg':'http://www.omg.org/XMI'}
    La méthode de recherche se voit ajouter cette structure en paramètre supplémentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for node in parent.findall('./contains_FlowVariable', ns) :
    et des objets ainsi récupérés, j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            nodeId = node.get('{http://www.omg.org/XMI}id', ns)   # fonctionne
            #nodeId = node.get('omg:id', ns)   # ne fonctionne pas
    Qu'est-ce que j'ai loupé pour que la forme <clef dicoNs>:<attribut> ne fonctionne pas, alors que {<valeur dicoNs>}<attribut> fonctionne ?
    Grrrr, pas content !

  6. #6
    Membre régulier Avatar de bmayer
    Inscrit en
    Décembre 2003
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 153
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par DonKnacki Voir le message
    et en utilisant la verison longue, ça marche :
    print(parent.get('{http://www.omg.org/XMI}id'))
    Merci DonKnacki

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par bmayer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            nodeId = node.get('{http://www.omg.org/XMI}id', ns)   # fonctionne
            #nodeId = node.get('omg:id', ns)   # ne fonctionne pas

    Le second paramètre de get ne sert pas à indiquer un namespace mais une valeur par défaut

    get(key, default=None)
    Returns the attribute value, or default if the attribute was not found.

  8. #8
    Membre régulier Avatar de bmayer
    Inscrit en
    Décembre 2003
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 153
    Points : 79
    Points
    79
    Par défaut
    Aaah oui, c'est get(), pas find(), suis-bête ...

    Merci DonKnacki

    Il n'y aurait pas une forme pour préciser le namespace dans le get, de manière plus concise qu'avec l'URL ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    J'ai cherché un peu sans succès
    Souvent, c'est les nœuds qui ont le soucis du namespace

    Du coup, tu ne peux pas prendre tous attrib ? ou alors faire des constantes

Discussions similaires

  1. Glassfish + messages XML avec attributs
    Par pidjipi dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 11/06/2007, 18h50
  2. Shell XML : récupération attribut
    Par wwave dans le forum Linux
    Réponses: 3
    Dernier message: 23/03/2007, 12h06
  3. Cherche Schema XML du format XMI
    Par mickagame dans le forum Valider
    Réponses: 2
    Dernier message: 11/07/2005, 13h54
  4. [XSLT] XML->XML conversion attributs en balises
    Par ¤ Actarus ¤ dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/07/2005, 09h51
  5. xhtml ->xml xsl:attribute name+not valid
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 14/06/2005, 07h27

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