Discussion: XPath et Python

  1. #1
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut XPath et Python

    bonjour,
    Avant tout je tiens à dire que je ne connais ni XPath NI Python!!!

    A) j'ai un fichier TEXT.XML que je voudrais transformer en un fichier utilisable par un programme.
    j'utilise les commandes Python :

    with open('/text.xml') as f:
    t = etree.parse(f)


    malheureusement mon fichier TEXT.XML comporte plusieurs lignes : <?xml version="1.0" encoding="UTF-8" ?>

    et j'ai donc des erreurs : lxml.etree.XMLSyntaxError: XML declaration allowed only at the start of the document, line 15, column 6

    comment résoudre ce problème?


    B)

    je fais une découverte réseau avec un outil qui crée un fichier XML
    je veux extraire de ce fichier les noms et les adresses IP des devices
    je veux écrire ces données dans un fichier paramètre d'un outil de monitoring (en l'occurence Alignak)

    je ne veux donc rien faire à la main

    voila le fichier XML que je reçois :

    <?xml version="1.0" encoding="UTF-8" ?>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <IP>192.168.33.1</IP>
    <MAC>00:50:56:c0:00:08</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>
    <?xml version="1.0" encoding="UTF-8" ?>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <DNSHOSTNAME>gateway</DNSHOSTNAME>
    <IP>192.168.33.2</IP>
    <MAC>00:50:5650:d0</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>

    comme vous le voyez, il y a plusieurs lignes <?xml version
    je veux récupérer ce qu'il y a en gras :

    <DNSHOSTNAME>gateway</DNSHOSTNAME>
    <IP>192.168.33.2</IP>
    <MAC>00:50xx:d0</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>

    dans chaque balise <DEVICE>

    une idée?

    merci

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 803
    Points : 17 664
    Points
    17 664

    Par défaut

    Salut,

    Ce que vous montrez n'est pas un document XML mais la concaténation de plusieurs documents XML. Soit vous pouvez configurer l'engin qui les construit pour qu'il produise un document XML par fichier, soit il va vous falloir découper cela en plusieurs documents pour pouvoir utiliser un analyseur XML...
    Mais un document XML étant un fichier texte, vous pouvez aussi y rechercher les informations "à la main".

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

  3. #3
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut

    désolé mais c'est une seule commande qui produit ce fichier XML avec plusieurs lignes <?xml
    j'ai utilisé une commande shell pour supprimer ces lignes et maintenant je voudrais utiliser XPath pour travailler mon fichier fichier.xml

    je passe la commande sous python :

    with open('/fichier.xml') as f:
    x = etree.parse(f)


    mais j'ai une erreur :

    lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 14, column 1

    ou est l'erreur? je vois pas!!!!
    merci

    Voici mon fichier .xml :

    <REQUEST>
    <CONTENT>
    <DEVICE>
    <IP>192.168.33.1</IP>
    <MAC>00:50:56:c0:00:08</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <DNSHOSTNAME>gateway</DNSHOSTNAME>
    <IP>192.168.33.2</IP>
    <MAC>00:50:5650:d0</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <DNSHOSTNAME>CentOS-Virtual</DNSHOSTNAME>
    <IP>192.168.33.128</IP>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <IP>192.168.33.254</IP>
    <MAC>00:50:56:e0:53:4d</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 803
    Points : 17 664
    Points
    17 664

    Par défaut

    Citation Envoyé par trazomtg Voir le message
    mais j'ai une erreur :

    lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 14, column 1

    ou est l'erreur? je vois pas!!!!
    L'erreur vient de ce que vous avez la concaténation de plusieurs document XML et lorsque le parseur arrive à la fin du premier document, il râle d'y trouver autre chose que rien. Dit autrement, si vous voulez utiliser un parseur XML, il faut vous assurer que vous lui donner du XML bien formé.

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

  5. #5
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut

    m'enfin!!!! y'a qu'un document dans ce fichier.xml!

    j'ai plusieurs balises : <REQUEST> c'est ça le problème?

  6. #6
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 803
    Points : 17 664
    Points
    17 664

    Par défaut

    Citation Envoyé par trazomtg Voir le message
    m'enfin!!!! y'a qu'un document dans ce fichier.xml!

    j'ai plusieurs balises : <REQUEST> c'est ça le problème?
    Si cela vous fait plaisir de traduire le problème ainsi...
    En XML, on parle de document construits avec un prologue ("<?xml version="1.0"..." en fait partie) et un élément "racine"...
    Et avant de jouer avec des fichiers qui ressemblent a du XML, prendre le temps de chercher sur Internet un tuto qui vous raconte à quoi çà ressemble n'est pas un luxe. Cà déjà de comprendre les messages d'erreurs comme: "XML declaration allowed only at the start of the document" qui parle de bien de "document".
    Donc si vous ne savez pas ce que c'est, çà ne vous aide pas. Mais ouvrir un tuto. histoire de se retrouver moins bête, c'est pas si compliqué.

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

  7. #7
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut

    j'ai rajouté une ligne <?xml etc...... en tête du document mais ça ne change rien!!! j'ai beau regarder la doc!!!!
    j'ai toujours l'erreur :
    lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 15, column 1


    la ligne 15 est la ligne en gras :

    <?xml version="1.0" encoding="UTF-8" ?>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <IP>192.168.33.1</IP>
    <MAC>00:50:56:c0:00:08</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <DNSHOSTNAME>gateway</DNSHOSTNAME>
    <IP>192.168.33.2</IP>
    <MAC>00:50:5650:d0</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>

  8. #8
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 803
    Points : 17 664
    Points
    17 664

    Par défaut

    Un document, c'est par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8" ?>
    <REQUEST>
    <CONTENT>
    <DEVICE>
    <IP>192.168.33.1</IP>
    <MAC>00:50:56:c0:00:08</MAC>
    <NETPORTVENDOR>VMware</NETPORTVENDOR>
    </DEVICE>
    <MODULEVERSION>2.3</MODULEVERSION>
    <PROCESSNUMBER>1</PROCESSNUMBER>
    </CONTENT>
    <DEVICEID>foo</DEVICEID>
    <QUERY>NETDISCOVERY</QUERY>
    </REQUEST>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 3 274
    Points : 6 313
    Points
    6 313
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Un document XML a une structure arborescente, dont chaque branche commence par un <tag> et finit par un </tag>

    Ici, le document XML commence par <REQUEST> et se termine par </REQUEST>. Ce qui suit est ANORMAL pour un document XML => d'où l'erreur, qui est d'ailleurs très clairement formulée.

    En conséquence, quand on lit toutes les lignes du fichier, il faut repérer les débuts avec ligne=="<REQUEST>" et les fins avec ligne=="</REQUEST>" pour traiter chacun des documents XML contenus dans le fichier texte.
    Ne jamais remettre au lendemain ce que quelqu'un d'autre peut faire pour vous le jour même...
    La journée internationale de procrastination prévue initialement aujourd'hui, est repoussée à demain...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut

    j'ai trouvé!!!

    il faut une balise racine au début et une qui se ferme à la fin

  11. #11
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 803
    Points : 17 664
    Points
    17 664

    Par défaut

    Citation Envoyé par trazomtg Voir le message
    il faut une balise racine au début et une qui se ferme à la fin
    De toutes façons, il va falloir lire tout le fichier ligne à ligne, pour trouver et supprimer celles contenant des <?xml... superflus.
    A chaque suppression, ce qui aura été lu est un document XML.
    Ajouter un tag au début et à la fin est une solution pour avoir un seul document.
    Mais de toutes façons les informations qui vous intéressent sont à extraire de chaque document.
    A vous de choisir comment résoudre le problème.

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

  12. #12
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut

    hello,

    j'ai utilisé des commandes shell pour supprimer les lignes ?xml etc........ et ajouter une balise racine en tête et en fin de fichier.
    je vais utiliser XPath pour récupérer les données dans un programme Python (parait que ça fonctionne!!!) et je pourrai formater mon fichier en sortie

    est ce que c'est bon? je connais rien à XPath!!
    merci

  13. #13
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut

    bonjour,

    je cherche une doc pour utiliser XPath dans Python
    je ne connais rien à XPath ni à Python!!!

    je veux extraire des données d'un fichier XML afin de construire un aurez fichier.
    est ce le meilleur moyen ? que me conseillez vous?

    merci

  14. #14
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 803
    Points : 17 664
    Points
    17 664

    Par défaut

    Citation Envoyé par trazomtg Voir le message
    je cherche une doc pour utiliser XPath dans Python
    je ne connais rien à XPath ni à Python!!!
    Si vous ne connaissez rien à Python, il faut commencer par ouvrir un tuto. et apprendre.
    Une fois que vous serez plus à l'aise avec le langage, pour récupérer des informations via XPath avec Python, la lecture de la documentation d'ElementTree et de ses exemples est un bon début.

    Si vous connaissiez un peu Python, le format des fichiers que vous avez montré est assez simple.
    Lire le fichier ligne à ligne, filtrer celles qui commencent par les tags qui vous intéressent, récupérer l'information qu'il y a dedans, ... sont des opérations qui utilisent les fonctionnalités de bases des chaînes de caractères.
    Inutile de connaître XPath ou XML pour faire çà.

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

  15. #15
    Membre du Club
    Homme Profil pro
    administrateur systemes et reseaux
    Inscrit en
    septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : administrateur systemes et reseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 111
    Points : 49
    Points
    49

    Par défaut XML XPath et Python

    Bonjour,

    j'ai un fichier XML
    je voudrais extraire des données de ce fichier à l'ai de XPath dans un programmer Python, pour construire un autre fichier texte.
    est ce possible?

    comment faire?
    je ne connais rien à XPath ..... ni à Python
    merci
    T

  16. #16
    Membre expert
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 291
    Points : 3 725
    Points
    3 725

    Par défaut

    comment faire?
    je ne connais rien à XPath ..... ni à Python
    wiztricks a été suffisamment clair pourtant, nous ne donnons pas de code tout fait, il faut faire votre recherche...

    Apprenez python, puis l'existence de modules permettant d'analyser un fichier XML, seul moyen de créer quelque chose.

    Si vous ne souhaitez faire aucune recherche, il faut rendre visite à un professionnel, le coût du travail sera d'une autre forme.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 13h32
  2. [XPath] Position d'un élément
    Par ovh dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 07/04/2003, 16h26
  3. sum(XPATH) retourne NaN
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 19/03/2003, 14h48
  4. XPath: intersection de chemins
    Par aldo047 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/03/2003, 11h30
  5. Cours en Français sur XML-XSL et XPath
    Par Community Management dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 25/04/2002, 16h46

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