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

XML/XSL et SOAP Discussion :

Traitement XML


Sujet :

XML/XSL et SOAP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Traitement XML
    Bonjour à tous et merci d'avance à ceux qui pourront m'aider.

    Je dois traiter des fichiers xml en récupérant les informations contenus dedans.

    J'arrive à récupérer quasiment toutes les informations contenu dans les balises toutefois, d'un XML à un autre, une balise précises, peut contenir une sous balise et c'est là que je bloque.

    Voici le 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
    <BODY>
       <SECTION>
          <IT1><B>blablabla...</B></IT1>
             <PAR>blablabla...<BR/></PAR>
             <PAR>blablabla...<BR/></PAR>
       </SECTION>
       <SECTION>
          <IT1><B>blablabla</B></IT1>
             <PAR>blablabla...(<I>lire en page 3).</I><BR/></PAR>
       </SECTION>
       <ENCADRE>
          <ETX><B><I>blablabla</I></B></ETX>
          <ETX><B><I>blablabla</I></B></ETX>
       </ENCADRE>
       </TEXTE>
    </BODY>
    <PDF id="20130809_REN_002" nature="page"/>
    </DOC-PRESSED>
    Je n'ai pas pris la peine d'ajouter le reste car il m'est facile d'y récupérer les informations.

    Comme vous pouvez le voir dans l'exemple, il peut parfois apparaître dans la balise <TEXTE>==><PAR> comme parfois dans la balise <SECTION>==><PAR> des sous balises <IT1> ou <I> etc...

    Voici la commande que je tape pour récupérer toutes les balises <PAR> contenu dans <TEXTE>

    Code Python : 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
    from xml.dom import minidom
    def getText(nodelist):
        rc = []
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc.append(node.data)
        return ''.join(rc)
     
    try :
       dom = minidom.parse(ficXML)
       root = dom.documentElement
    except :
       print "erreur"
       break
     
    if (root.getElementsByTagName("TEXTE")):
       texte = root.getElementsByTagName("TEXTE")[0]
       par = texte.getElementsByTagName("PAR")
       i=0
     
       for i, tmp in enumerate(par):
          if (texte.getElementsByTagName("PAR")[i]):
             words = getText(texte.getElementsByTagName("PAR")[i].childNodes).strip().encode("utf-8")
             print words
             i+=1
          else:
             continue

    Ce script m'affiche les textes sans le texte contenu dans <I>.

    En Perl, il m'est facile d'afficher tout le contenu de la balise <TEXTE> avec les lignes suivantes :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $noeuds->find_by_tag_name("TEXTE")->as_text;
    Il m'affiche tout le texte même ceux dans les sous balises.

    Malheureusement, avec Python, je ne trouve pas le moyen d'afficher le texte mise à part me déplacer dans les sous balises etc...

    Est-ce possible de supprimer ces balises pour que son contenu fasse partie de la balise Parents <PAR>?

    Est-ce possible de savoir si une balise possède une balise enfant (car il n'y est pas systématiquement).

    Je ne suis pas obligé d'utiliser xml.dom.
    Merci d'avance pour votre aide.

    Cordialement.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je me suis effectivement déjà posé la question et n'ai pas trouvé d'autre solution qu'une approche récursive : parcourir tous les descendants et concaténer tous les nœuds texte rencontrés.


    Sinon, ça vaut la peine d'essayer la bibliothèque tierce pxdom.
    Ils disent qu'ils gèrent le W3C DOM Level 3, ce qui devrait donc permettre de lire .textContent
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Cela peut se faire comme ça.
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def getText(nodelist):
        rc = []
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc.append(node.data)
            if node.nodeType == node.CDATA_SECTION_NODE:
                rc.append(node.data)
            if node.nodeType == node.ELEMENT_NODE:
                rc.append(getText(node.childNodes))
        return ''.join(rc)

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup!!
    Cela fonctionne parfaitement!

    Quand je pense que j'ai passé une journée dessus pour rien...
    Merci à tout le monde de votre aide.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Ah juste au cas où....
    Tu saurais comment avant tout traitement du fichier XML, supprimer toutes les balises vides?
    Merci d'avance.

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    ...supprimer toutes les balises vides?
    Ca peut interpréter ou se prendre plusieurs sens. Si je comprends bien, vous pouvez faire ça comme point de départ.
    Code Python : 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
    def getText(nodelist):
        rc=[]
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                if node.data.strip()=='':
                    return ''
                else:
                    rc.append(node.data.strip())
            if node.nodeType == node.CDATA_SECTION_NODE:
                if node.data.strip()=='':
                    return ''
                else:
                    rc.append(node.data.strip())
            if node.nodeType == node.ELEMENT_NODE:
                s=getText2(node.childNodes)
                if s!='':
                    rc.append(s)
        return ''.join(rc)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Je n'ai pas été assez précis.
    Enfaite, lorsque je parse le fichier XML, je souhaiterai à ce moment là, que le parser ne parse pas les balises vides :
    Exemple :
    <Balise1 />
    <Balise2></Balise2>

    En Perl, avec cette commande c'est possible :
    $xml = XMLin("exemple.xml",SuppressEmpty => 1);

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Ca n'ai pas d'effet visible; et puis minidom se fait d'economie judicieux d'après les auteurs.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'aurais peut être du travailler avec un autre module.
    Merci de ta réponse et de ton aide

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

Discussions similaires

  1. Traitement XML en C
    Par Traroth2 dans le forum XML
    Réponses: 5
    Dernier message: 20/06/2007, 14h32
  2. Traitement XML sous matlab
    Par berga dans le forum MATLAB
    Réponses: 2
    Dernier message: 18/04/2007, 17h58
  3. [XSLT] Comment optimiser les traitements XML/XSL ?
    Par thibaut06 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/03/2006, 16h39
  4. traitement XML
    Par skaii dans le forum MFC
    Réponses: 7
    Dernier message: 24/05/2005, 18h19
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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