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

Format d'échange (XML, JSON...) Java Discussion :

Ignorer balises lors du parsing [JDOM]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut Ignorer balises lors du parsing
    Bonjour , j ' aimerai pouvoir parser un fichier html que je récupere sur internet via jdom.
    Or , je ne peut parser le fichier a cause de la ligne :"<!DOCTYPE html>
    <html lang="fr">" qui se trouve dans le fichier.
    Peut - on ignorer ces instructions lors du parsing html ?

    Pour info , mon fichier html ressemble a 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    <!DOCTYPE html>
    <html lang="fr">
      <head>
        <meta name="generator"
        content="HTML Tidy for Java (vers. 2009-12-01), see jtidy.sourceforge.net" />
        <meta http-equiv="content-type"
        content="text/html; charset=ISO-8859-1" />
    <script type="text/javascript">
    (function(){var h=document.documentElement;h.className+=" js";(new
    Image()).src='http://a.l.yimg.com/a/i/eu/sch/fr_srp_metro_20090914.png';})();
        </script>
        <link rel="alternate" type="application/rss+xml"
        title="Yahoo! France Search results for itin"
        href="http://api.search.yahoo.com/WebSearchService/rss/webSearch.xml?appid=yahoosearchwebrss&amp;query=itin&amp;adult_ok=1&amp;region=fr" />
        <title>itin - Yahoo! France R�sultats de
        recherche</title>
        <link rel="stylesheet" type="text/css"
        href="http://a.l.yimg.com/a/lib/s8/srp-core-css_201102221437.css" />
    <style type="text/css">
    s,.sprt,#logo,#att_icon,#verizon_icon
    .ico,#at-tog,.h-gui-icon,.ssbang,.sschk,.ssochk,.ssbx,#ss
    a.ss-remove,.ads a.pp-l,.news-nph,.stars-sm span,.stars-lg
    span,.thmbplay,.sc-promo-img,.sc-close{background-image:url(http://a.l.yimg.com/a/i/eu/sch/fr_srp_metro_20090914.png);}.alsotry{font-size:1.1em;}.msg404{background-color:#7B0099;color:#FFF;margin-left:197px;padding:5px;line-height:1.5em}.msg404
    h1{font-size:138.5%;display:inline;margin-left:5px;*margin-left:0}.msg404
    .ico{float:left;width:22px;height:22px;top:-2px;left:-2px;border:none;margin-right:2px}.msg404
    .ico img{width:22px;height:22px;vertical-align:top;border:1px solid
    #7B0099}.msg404 a,.custom a:visited{color:#FFF}.msg404
    p{margin-left:28px}.msg404 .relmsg{font-weight:bold}.msg404 .relmsg
    cite{font-weight:normal}
        </style>
    <style type="text/css">
    .sm-plain
    .thmbplay,span.sm-ldg,a.sm-cls,span.sm-flg,a.sm-flg,a.sm-snd,a.sm-hlp,a.sm-ext,a.sm-ext-u,.bbl-cls,#ysch
    .yui-dialog .container-close,#ysch .yui-dialog
    div.on,.sm-ctl-b,.sm-ctl-t{background-image:url(http://a.l.yimg.com/a/i/us/sch/gr4/smsprt_20090407.png);background-repeat:no-repeat;font-size:
    0;}.ads.horiz.bot{background-color:#ecf4fa;}.rais{min-width:516px}.rais
    h2 a{margin-right:7px}.rais
    .abst{max-width:42em;margin-right:8px;_margin-right:0;_width:508px}.rais
    p{margin-top:1px;*margin-top:0}.spns li.rais div
    h3{margin-bottom:1px}.spns li.rais div h3 a{font-size:123%}.spns
    li.rais div a{font-size:100%}body.opera .rais h3,body.safari .rais
    h3{margin-bottom:0}.rais .thmb{float:right;margin:4px 0 0 5px}.rais
    .btm{clear:both}.rais em{color:#008000}.rais_dl{color:#888}.rais_dl
    a{white-space:nowrap}.rais_vert{max-width:28em;margin:0;padding:3px
    0 0
    43px}.rais_vert:after{clear:both;content:'.';display:block;height:0;visibility:hidden}.rais_vert_dl{max-width:20em;float:left}.rais_vert_frm{max-width:20em;float:left;margin-left:35px}.ads
    li.rais .rais_dl a{display:inline}.ads.horiz{zoom:1}.ads .rais
    .vidmsg{width:94px;margin-left:4px}.ads .rais .thmb
    span.thmbplay{background-position:-183px
    -376px}#rais_cr_pdt,#rais_cr_ddt,#rais_cr_loc,#rais_go{font-size:12px}#rais_cr_pt,#rais_cr_dt{bottom:1px;font-size:11px;position:relative}.ads.horiz
    ul.reducepx-spnslist{padding-bottom:4px;padding-top:3px}.rais
    a.thmb{width:82px;height:62px;border:1px solid
    #999;background-color:#FFF}.rais .thmb
    img{width:80px;height:60px;border:0;margin:1px}.rais
    img.thmb{width:80px;height:60px}.rais .logo{top:57px}.rais
    div.clr{clear:both}.rais ul.pharma{float:right;padding:0}.rais
    ul.pharma li{padding:0;margin:0}.rais ul.pharma
    .thmb{float:left;width:87px;height:67px}#warn_lnk{cursor:pointer}#warn_lnk
    a{margin-left:5px;margin-right:2px;color:#0000DE;font-size:12px}#warn_lnk
    s{background-repeat:no-repeat;cursor:pointer;font-size:0}#warn_lnk
    s.ico-colps{background-position:-192px
    -66px;height:5px;width:8px;cursor:pointer;display:inline-block}#warn_lnk
    s.ico-expnd{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);_filter:none;top:-2px;position:relative}.rais
    .warnmsg{font:12px arial;float:left;height:0;width:490px;margin:4px
    15px 7px 0;background-color:#fff;border:1px solid
    #999;padding:10px;overflow:auto}.rais .warnmsg
    h4{color:#0000DE;text-decoration:underline;font-weight:bold;margin-bottom:1em}.rais
    .hide{border:medium
    none;overflow:hidden;padding:0;margin:0;position:relative}
        </style>
      </head>
      <body id="ysch" class=" netscape windows v5_0">
        <div id="doc">
          <h1 class="off-left">Yahoo! France Recherche Web</h1>
          <div id="uh">
            <ul class="l">
              <li class="hi">Bonjour, 
              <strong>Invit�</strong></li>
              <li>
                <a
                href="http://fr.wrs.yahoo.com/_ylt=A7x9Qb5hr6VNIVAA7UVjAQx./SIG=15ft0suel/EXP=1302725569/**http%3a//login.europe.yahoo.com/config/login%3f.src=srch%26.intl=fr%26.done=http%253A%252F%252Ffr.search.yahoo.com%252Fsearch%253Fei%253DUTF-8%2526q%253Ditin"
                 target="_top">Ouvrir une session</a>
              </li>
              <li>
                <a
                href="http://fr.wrs.yahoo.com/_ylt=A7x9Qb5hr6VNIVAA7kVjAQx./SIG=11utmp3ug/EXP=1302725569/**http%3a//eur.help.yahoo.com/help/fr/ysearch/">Aide</a>
              </li>
    etc....
    Merci bien

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par j2ee60 Voir le message
    Bonjour , j ' aimerai pouvoir parser un fichier html que je récupere sur internet via jdom.
    Or , je ne peut parser le fichier a cause de la ligne :"<!DOCTYPE html>
    <html lang="fr">" qui se trouve dans le fichier.
    Peut - on ignorer ces instructions lors du parsing html ?
    JDOM n'a pas le moindre problème avec ces balises-là.

    Il n'y a pas moyen de dire à un parseur XML d'ignorer certaines balises, non... Mais il est toujours possible de modifier la source pour les enlever, avant d'envoyer ça au parseur.
    Toutefois, tu n'as pas de problème sur les balises citées.

    Note au passage que JDOM sert à charger du XML, pas du HTML. Il est vrai que ce document ressemble à du XML bien formé, mais j'imagine que ce n'est qu'un hasard.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    Merci de ta réponse.

    Je pense au contraire que JDOM ne lit pas ces balises la.
    Voici mon code:

    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
     public static  Element initialiserHtml()
     {
         sxb = new SAXBuilder();
     
         try
         {
            document = sxb.build(new File("fichier.xml"));
            System.out.println(document);
            racine= document.getRootElement();
           System.out.println(racine);
         }
         catch(NullPointerException e){ 
        	 JOptionPane.showMessageDialog(null, "Aucun fichier XML ouvert" , "Erreur", JOptionPane.ERROR_MESSAGE);
     
        	 } 
         catch (JDOMException e) {
        	 JOptionPane.showMessageDialog(null, "Fichier XML mal construit" , "Erreur", JOptionPane.ERROR_MESSAGE);
        	 }
         catch (IOException e) {
        	 JOptionPane.showMessageDialog(null, "Impossible d ' ouvrir le fichier XML" , "Erreur", JOptionPane.ERROR_MESSAGE);
        	 }
     
     
         return racine ;
     
     }
    Celui ci fonctionne parfaitement quant j ' ouvre un autre fichier xml sans les balises problématiques, mais quant j ' ouvre le fichier xml m ' intéressant , il me renvoi au catch de JDOMException.
    La fonction getRootElement me renvoi nul quoi qu ' il arrive...
    C ' est quasiment le même problème que sur ce topic:
    http://www.developpez.net/forums/d41...ug-jdom-xhtml/

    Si tu as une idée du pourquoi , je suis preneur sachant que je ne peux pas modifier la source puisque je génère mon fichier automatiquement.

    Pour la mise en forme du document html qui ressemble a du xml , c ' est parce que j ' utilise l ' api jtidy qui permet de générer une architecture xml a partir de HTML.

    Merci bien

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par j2ee60 Voir le message
    Je pense au contraire que JDOM ne lit pas ces balises la.
    Eh bien il est temps pour toi de cesser de penser des choses, et de les prouver à la place.

    Tu vois ce document :
    testdoctype.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!DOCTYPE html>
    <html lang="fr">
      <head/>
    </html>
    Il contient les deux balises suspectées, plus une autre pour donner un genre de contenu.

    Voici un test :
    TestDoctype.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class TestDoctype {
      public static void main(String[] args) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(new File("testdoctype.xml"));
        new XMLOutputter().output(doc, System.out);
      }
    }
    Conclusion : pas le moindre défaut, tout exactement comme tout doit être. Ces balises ne posent pas le moindre problème à JDOM, et il les lit et les conserve précieusement.

    Prenons maintenant le fichier que tu avais donné en exemple : il n'y a que le début et certaines balises ne sont pas fermées, ce qui fait qu'il est mal formé. Faisons-en le nouveau contenu de testdoctype.xml, fermons les balises qui ne sont pas fermées, lançons le même programme.

    Conclusion : réplique parfaite, avec la déclaration XML facultative ajoutée au début, et les caractère 0xFFFD passés de character references à caractères littéraux en ligne, ce qui est parfaitement autorisé.


    Citation Envoyé par j2ee60 Voir le message
    Celui ci fonctionne parfaitement quant j ' ouvre un autre fichier xml sans les balises problématiques, mais quant j ' ouvre le fichier xml m ' intéressant , il me renvoi au catch de JDOMException.
    La fonction getRootElement me renvoi nul quoi qu ' il arrive...
    C ' est quasiment le même problème que sur ce topic:
    http://www.developpez.net/forums/d41...ug-jdom-xhtml/

    Si tu as une idée du pourquoi , je suis preneur sachant que je ne peux pas modifier la source puisque je génère mon fichier automatiquement.
    J'ai essayé ton code, et getRootElement() ne renvoie jamais null, conformément d'ailleurs à ce qu'indique sa JavaDoc.
    Avec les deux exemples que nous avons testés au-dessus, getRootElement() renvoie très exactement la racine, sans aucun soucis.

    J'ai essayé avec des exemples de HTML, qui ne seraient pas du XML bien formé : dans ce cas-là, bien entendu, sxb.build() échoue et lance une JDOMException, ce qui fait que getRootElement() n'est pas appelé. L'exception en question est catchée, puis le programme continue, alors que la variable racine n'a pas été assignée.
    Par conséquent, initialiserHtml() renvoie null dans ce cas.
    Notons au passage que cette construction statique et pleine d'Exceptions catchées et qui laissent le programme continuer, est particulièrement maladroite, avec les résultats que l'on constate.

    Autrement dit, c'est sûrement ce que je dis depuis le début : complet, ton document n'est sûrement pas du XML bien formé, seul ce que tu en as montré en est.


    Citation Envoyé par j2ee60 Voir le message
    Pour la mise en forme du document html qui ressemble a du xml , c ' est parce que j ' utilise l ' api jtidy qui permet de générer une architecture xml a partir de HTML.
    Tu en es sûr ? À ma connaissance, JTidy sert à lire, manipuler et écrire du HTML. Pas du XML.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    Merci pour ton explication très complète et pertinente

    Je comprend beaucoup mieux le problème grâce a ton aide.
    En fait , la page que je récupérais via le moteur de recherche yahoo mettait les balises fermantes dans une balise script(<script type="text/javascript">) qui donc n ' était pas accessible dans le document. Je n ' ai pas prix le temps de vérifier le html car je croyais que jtidy me fournirai déjà un document validé .

    J ' ai réglé le problème en changeant de moteur de recherche .

    Notons au passage que cette construction statique et pleine d'Exceptions catchées et qui laissent le programme continuer, est particulièrement maladroite, avec les résultats que l'on constate.
    En fait , j ' aurai besoin plus tard de pouvoir identifier dans une GUI les différents type d ' erreurs possibles lors du parsing xml , voila pourquoi je catch plusieurs exceptions différentes.

    Tu en es sûr ? À ma connaissance, JTidy sert à lire, manipuler et écrire du HTML. Pas du XML.
    Autant pour moi désolé
    Je voulais dire par la que jtidy permettait d ' enregistrer du html dans une architecture proche du xml(validation du document,formatage du doc)

    Merci beaucoup pour ton aide thelvin

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

Discussions similaires

  1. problem d'apostrophe lors du parsing
    Par taouja dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/04/2007, 18h01
  2. [DOM] Erreur I/O lors du parsing d'une string
    Par jakouz dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 19/04/2006, 18h08
  3. [XHR]pb lors du parsing du XML(il n'existe pas)
    Par hansaplast dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/03/2006, 13h55
  4. [XSLT] Changer les noms de balise lors de la fusion
    Par toxine dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 25/01/2006, 09h47
  5. [DOM] Erreur lors du parsing d'un fichier XML par l'API DOM
    Par patricetoan dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 26/09/2005, 12h43

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