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

APIs XML Discussion :

JDOM ou XPATH pour récupérer les infos d'un fichier html ?


Sujet :

APIs XML

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut JDOM ou XPATH pour récupérer les infos d'un fichier html ?
    Bonjour,

    Sachant que les balises sont distinguables grâce à des attributs de type class, quel moyen est le plus rapide selon vous entre JDOM et XPATH, afin de récupérer les valeurs affichées ?

    voici un exemple de la page html:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <td class="tvs_td_numero" headers="train_id_0 numero_id">
        848566			
    </td>
    <td class="tvs_td_originedestination" headers="train_id_0 originedestination_id">
        PARIS-NORD
    </td>
    merci pour vos réponses

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Sauf erreur de ma part, JDOM ne permettra pas de cibler directement les éléments ayant l'attribut en question : il faudra tout parcourir depuis la racine, de fils en fils.

    XPath est là pour permettre de trouver les éléments selon une requête.

    En terme de performances, on peut bien penser que XPath fait, tout de même, bien la même chose, à savoir parcourir toute l'arborescence mais on peut souhaiter que ce soit fait de la manière la plus optimisée possible...

    En conclusion, entre un code concis et supposé efficace et un code plus ou moins long, je choisirais XPath sans hésitation.

    Autre point, êtes-vous sûr à 100% que le code HTML que vous voulez parser est toujours du XML bien formé ? Je vois souvent des pages déclarées XHTML qui, en fait, ne sont même pas bien formées... Je me suis fait une fonction pour forcer cela (actuellement seulement en C# et en PHP, un portage Java devant avoir lieu bientôt), le tout étant téléchargeable sur SourceForge (http://sourceforge.net/projects/light-html2xml).

  3. #3
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut
    D'accord, je pense que je vais partir sur XPATH.
    Cependant je n'ai pas encore vérifié si le fichier est bien formé, cela peut empêcher le bon fonctionnement des requêtes XPATH le cas échéant ?

  4. #4
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Si le document n'est pas bien formé, il ne peut même pas être chargé en mémoire !

  5. #5
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut
    Oui, je viens de tester et à cause de fonctions javascripts, la construction du Dom plante, il faudrait pouvoir éliminer les parties javascript.

  6. #6
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    C'est pour cela que la fonction que j'ai écrite met le contenu des balises script en CDATA.

  7. #7
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Dans le cas d'un document html, j'utiliserais soit un html parser,soit
    une expression régulière pour extraire des infos.
    A+

  8. #8
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Je trouve qu'il est bien plus simple et plus évolutif d'utiliser des requêtes XPath plutôt qu'un DOM HTML ou des expressions régulières.

  9. #9
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Je suis d'accord, mais XPATH n'est pas utilisable dans tout les cas avec HTML...

    Par exemple un tag <li> qui ne ferme pas est tout a fait valable en HTML, mais
    cela n'est pas possible en XML

    Plus vicieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div>  blala blala <i>blabla</i></div>
    n'est pas du tout utilisable en XML...

    Il y a bien la norme XHTML qui réconcilie tout cela, mais la plupart des document HTML ne sont pas "bien formé" pour un parser XML

  10. #10
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut
    J'ai restreint le fichier html, et je peux désormais utiliser XPATH. Pour cela j'utilise JDom, mais pour une requête qui doit me renvoyer 10 éléments, j'en obtiens bien 10 mais avec la même valeur, celle du premier élément.

    Voici une partie de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    XPath xpa = XPath.newInstance("//td[@class='tvs_td_numero'");
    List results = xpa.selectNodes(racine) ;
    Iterator iter = results.iterator() ;
    Element noeudCourant = null;
    while (iter.hasNext()){
        noeudCourant = (Element) iter.next();
        System.out.println("Valeur : " + xpa.valueOf(noeudCourant));
    }
    Je ne sais pas si la requête est mauvaise ou bien si l'affichage n'invoque pas la bonne méthode ?

    ps: je me suis basé sur un tuto suivant:
    http://zedros.developpez.com/tutoriels/java/xml/xpath/

  11. #11
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Citation Envoyé par oca Voir le message
    Je suis d'accord, mais XPATH n'est pas utilisable dans tout les cas avec HTML...

    Par exemple un tag <li> qui ne ferme pas est tout a fait valable en HTML, mais
    cela n'est pas possible en XML

    Plus vicieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div>  blala blala <i>blabla</i></div>
    n'est pas du tout utilisable en XML...

    Il y a bien la norme XHTML qui réconcilie tout cela, mais la plupart des document HTML ne sont pas "bien formé" pour un parser XML
    C'est bien pour cela que je me suis fait la dite fonction pour "réparer" les balises HTML et, donc, fermer les balises devant l'être en XML !

  12. #12
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Ok, mais juste par curiosité, ce cas là, tu le traites comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div>  text1<i>text2</i></div>
    Tu crées automatiquement une balise pour contenir text1 ?
    Parce qu'en xml un tag ne peut pas contenir du texte et des tags enfants...

    A+

  13. #13
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Mais si, mais si ! On peut tout à fait avoir en XML à la fois des fils texte et des fils éléments ! Et le bon XHTML, quand il est du XML, n'est pas bien différent du HTML.

  14. #14
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Ah oui tiens... ça marche... autant pour moi désolé...

  15. #15
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut
    Concernant, mon pb est-ce que quelqu'un aurait une idée

  16. #16
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Ah oui désolé, c'est un peu partis HS à cause de moi
    tu peux essayer cela :

    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
    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
    import org.jdom.xpath.*; 
    
    public class Test {
    	public static void main(String[] args) throws Exception {
    		SAXBuilder saxBuilder = 
    		    new SAXBuilder("org.apache.xerces.parsers.SAXParser");
    		org.jdom.Document racine =
    		    saxBuilder.build(new File("test.xml"));
    		XPath xpa = XPath.newInstance("//td[@class='tvs_td_numero']");
    		List results = xpa.selectNodes(racine) ;
    		Iterator iter = results.iterator() ;
    		Element noeudCourant = null;
    		while (iter.hasNext()){
    		    noeudCourant = (Element) iter.next();
    		    System.out.println(">"+noeudCourant.getText().trim());
    		}
    		System.out.println("Completed");
    	}
    }

  17. #17
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Et si tu as java 1.5 tu n'a même pas besoin de JDOM...
    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 java.io.File;
    import java.io.FileInputStream;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathFactory;
     
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
     
    public class Test1_5 {
    	public static void main(String[] args) throws Exception {
    		XPathFactory  factory=XPathFactory.newInstance();
    		XPath xPath=factory.newXPath();
     
    		InputSource inputSource = new InputSource(new
    		         FileInputStream( new File("test.xml")));
     
    		NodeList  nodes = 
    		    (NodeList)xPath.evaluate("//td[@class='tvs_td_numero']", inputSource, XPathConstants.NODESET);
     
     
    		for (int i = 0;i<nodes.getLength();i++) {
    			Node node = nodes.item(i);
    			System.out.println(">"+node.getTextContent().trim());
    		}
     
    	}
    }
    A+

  18. #18
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut
    Merci pour tes réponses, la solution 1.5 me plait bien.
    Juste pour savoir, dans la 1ere solution, c'est la méthode trim() qui permet de passer en revue tous les noeuds ?

  19. #19
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    hello, c'est getText() qui te renvoie... le text, trim() supprime jute les espaces de début et fin, mais n'est pas indispensable.
    A+

  20. #20
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 66
    Points
    66
    Par défaut
    J'ai utilisé la méthode java 1.5 afin de faire plusieurs requêtes XPath à la suite, mais à partir d'un flux xml provenant d'Internet, le problème est que je suis obligé pour chaque requête de réouvrir le même flux à chaque fois, sinon j'obtiens une erreur comme quoi le fichier est mal terminé :

    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
     
    URL google = new URL("http://www.monurl.com/monFichier.xml");
                URLConnection googleConnection = google.openConnection();
                InputSource dis;
     
                dis = new InputSource(googleConnection.getInputStream());
     
                XPathFactory factory = XPathFactory.newInstance();
        		XPath xPath = factory.newXPath();
     
        		NodeList  nodes = (NodeList)xPath.evaluate("//variable1", dis, XPathConstants.NODESET);
        		String variable1 = (nodes.item(0).getTextContent().trim());
     
                googleConnection = google.openConnection();
        		dis = new InputSource(googleConnection.getInputStream());
        		nodes = (NodeList)xPath.evaluate("//variable2", dis, XPathConstants.NODESET);
        		String variable2 = (nodes.item(0).getTextContent().trim());
     
        		googleConnection = google.openConnection();
        		dis = new InputSource(googleConnection.getInputStream());
        		nodes = (NodeList)xPath.evaluate("//variable3", dis, XPathConstants.NODESET);
        		String variable3 = (nodes.item(0).getTextContent().trim());
     
     
                System.out.println("variable1 : " + variable1 + ", variable2: " + variable2 + ", variable3 : " + variable3);
    Comment est-ce que je pourrais simplifier ce code ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment fait-on pour récupérer les infos d'une image
    Par Mario Rousson dans le forum VB.NET
    Réponses: 4
    Dernier message: 30/11/2011, 14h10
  2. Réponses: 5
    Dernier message: 02/05/2008, 15h28
  3. Réponses: 1
    Dernier message: 30/04/2008, 15h09
  4. Réponses: 3
    Dernier message: 23/05/2007, 23h52
  5. Réponses: 7
    Dernier message: 06/04/2007, 17h53

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