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

Langage Perl Discussion :

parser un document xml/xhtml


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Par défaut parser un document xml/xhtml
    Bonjour,

    J'ai un fichier xhtml qui en gros ressemble a cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0" encoding="utf-8"?>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
    ...
    </head>
    <div class="text">
    <p><span><span> paragraphe1 </span></span></p>
     
    <p><span><span> paragraphe2 </span></span></p>
     
    </div>
    je souhaiterai transformer ce fichier pour obtenir cela en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <P>
    paragraphe1
    <P>
    paragraphe2
    Je recherche un parser xml/xhtml qui me permettrait de faire cela simplement. Je prefere utiliser un parser car par la suite j'aurai peut etre d'autres manipulation a realiser.

    pour le moment j'ai tenter d'utiliser MojoOM mais cela ne renvoi rien:
    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
     
    #!/usr/bin/env perl
     
    use strict;
    use warnings;
    use feature 'say';
    use Mojo::DOM;
     
    # slurp all DATA lines
    my $dom = Mojo::DOM->new(do { local $/; <DATA> });
     
    say $_->text for $dom->at('.text')->find('p')->each;
     
    __DATA__
    <div class="text">
    <p><span><span><span>para1</span></span></span></p>
    <p><span><span><span>para2</span></span></span></p>
    </div>
    merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Peut-être l'un des modules XML du CPAN: par exemple, XML:: Parser, XML::LibXML.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Peut-être l'un des modules XML du CPAN: par exemple, XML:: Parser, XML::LibXML.
    J'ai choisi LibXML mais pour le moment ce n'est pas exactement ce que je veux.

    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
     
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::LibXML;
    use utf8; binmode(STDOUT, ":encoding(UTF-8)");    use open qw( :encoding(UTF-8) :std );
     
    my $FichierXML = 'test.xml';
    my $parser     = XML::LibXML->new();
     
    my $tree = $parser->parse_file($FichierXML);
     
    my $root = $tree->getDocumentElement;
     
    # Balise para
    my @para = $root->getElementsByTagName('p');
    foreach my $childid (@para) {
    	print "<P>"."\n";
    	print $childid->getElementsByTagName('span')."\n";
     
    }
    j'aimerai avoir tout le texte contenu dans les balises p; le problème est que cette balise contient des sous noeuds span.

    Comment puis-je faire ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par knebhi Voir le message
    pour le moment j'ai tenter d'utiliser MojoOM mais cela ne renvoi rien:
    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
     
    #!/usr/bin/env perl
     
    use strict;
    use warnings;
    use feature 'say';
    use Mojo::DOM;
     
    # slurp all DATA lines
    my $dom = Mojo::DOM->new(do { local $/; <DATA> });
     
    say $_->all_text for $dom->at('.text')->find('p')->each;
     
    __DATA__
    <div class="text">
    <p><span><span><span>para1</span></span></span></p>
    <p><span><span><span>para2</span></span></span></p>
    </div>
    merci
    Change l'appel à la méthode "text" par l'appel à la méthode "all_text"

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Change l'appel à la méthode "text" par l'appel à la méthode "all_text"
    merci ça fonctionne très bien. par contre j'aimerai mettre un marqueur entre chaque paragraphe comme un # ou autre chose.

    quelle méthode je peux utiliser ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pourrais-tu donner un exemple de ce que tu veux obtenir ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Pourrais-tu donner un exemple de ce que tu veux obtenir ?
    en gros je veux récupérer tout le texte contenu dans les éléments <p> - mais seulement les <p> contenu dans la <div class="text">.

    au final je souhaite insérer une balise <P> entre chaque paragraphe pour obtenir ce résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <P>
    paragraphe1
    <P>
    paragraphe2

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Comme ceci ?
    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
    #!/usr/bin/env perl
     
    use strict;
    use warnings;
    use feature 'say';
    use Mojo::DOM;
     
    # slurp all DATA lines
    my $dom = Mojo::DOM->new(do { local $/; <DATA> });
     
    $dom->at('.text')->find('p')->each(sub { $_->content($_->all_text()) });
    say "$dom";
    __DATA__
    <div class="text">
    <p><span><span><span>para1</span></span></span></p>
    <p><span><span><span>para2</span></span></span></p>
    </div>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ perl 1.pl
    <div class="text">
    <p>para1</p>
    <p>para2</p>
    </div>

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

Discussions similaires

  1. parser un document xml
    Par TERRIBLE dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/03/2008, 08h06
  2. [SAX] parser un document xml
    Par skyangel dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 11/12/2007, 19h18
  3. [DOM4J] Parser un document XML avec DOM
    Par kroax dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 23/11/2007, 01h48
  4. [SimpleXML] parser un document xml distant
    Par turican2 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/05/2007, 15h18
  5. Parser mon document XML.
    Par Bruno13 dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2006, 14h30

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