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 Delphi Discussion :

[D7]introspecter la structure d'un fichier HTML


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut [D7]introspecter la structure d'un fichier HTML
    Bonjour,

    Je cherche à afficher dans un treeview de mon appli la "table of contents" d'un fichier chm. Pour chaque noeud, j'aimerai être capable de récupérer le fichier html associé.

    Après pas mal de galère, j'ai réussi à décompiler à la volée le fichier chm pour obtenir dans un dossier temporaire tous les fichiers html qui le composent et surtout le fichier "toc.hhc". Ce dernier semblant être un xml, je me suis dit que je pourrais le lire facilement via le composant TXmlDocument de Delphi7. Mais j'ai un problème. Le fichier semble mal indenté. A moins qu'il ne s'agisse en réalité pas d'un xml (les balises <LI> ne semblent pas fermées..!)

    Extrait du "toc.hhc"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <HEAD>
    </HEAD>
      <BODY>
    <OBJECT type="text/site properties">
    	<param name="ImageType" value="Folder">
    </OBJECT>
    <UL><LI> <OBJECT type="text/sitemap">
              <param name="Name" value="Table des matières">
              <param name="Local" value="index.html">
            </OBJECT><LI> <OBJECT type="text/sitemap">
          <param name="Name" value="Preface">
          <param name="Local" value="pr01.html">
        </OBJECT><LI> <OBJECT type="text/sitemap">

    Connaissez vous une façon d'obtenir ces informations ? je suis ouvert aux autres propositions, il existe peut-être une autre façon que j'ignore pour manipuler les chm comme par exemple une interface IChm ?

    Jean-Baptiste.

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Ce dernier semblant être un xml,
    Non, c'est un fichier html. Les balises ne sont effectivement pas fermées. Et il me semble même que le chm ne se compile pas lorsqu'elles sont fermées.

    Si tu veux analyser le fichier html, tu as MSHTML. Personnellement je ne m'en suis jamais servis en dehors d'un TWebBrowser, mais en théorie tu peux l'utiliser directement.

    Tu peux aussi parser le fichier html directement à la main.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut
    Merci Franck.

    La MSHTML semble très prometteuse, c'est une sacrée piste. J'ai regardé toute cette matinée et ça semble très complet. Par contre, indépendemment du TWebBrowser (on verra ça plus tard, disons que je l'utilise dans un premier temps), la navigation dans le IHtmlDocument2 est très obscure pour moi.

    Comment je dois faire pour récupérer une référence d'interface (de quelle type ?) pour lister les UL, les LI et les OBJECTS ainsi que les valeurs des paramètres ?
    Entre les OleVariants, les IDispatch et les millions d'interfaces imbriquées que j'ai apperçu, un guide me permettrai de garder la tête hors de l'eau

  4. #4
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut
    J'ai beau chercher, tenter, essayer, je ne comprends pas comment utiliser MSHTML via delphi.

    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
    procedure TForm1.Button1Click(Sender: TObject);
      var
        // VCL objects
        // Other objects
        // Interfaces
          fDoc : IHTMLDocument2 ;
          fBody : IHTMLElement ;
        // Integer
          iResult : integer ;
        // Float
        // String
          sError : widestring ;
        // Boolean
      begin
        sError := 'Default error message' ;
        iResult := 0;
     
     
        WebBrowser1.Navigate('file:///D:/JBW/Prog/QAD%20(Quick%20And%20Dirty)/065%20-%20MSHMTL/Help_Decompilated/test.html');
     
        fDoc := (WebBrowser1.document as IHTMLDocument2) ; // <= Là, fDoc n'est plus nil. Donc je suppose que je tiens un bon début.
     
        fBody := fDoc.body ; // <= Ici, fBody est toujours à nil et de là, je n'arrive plus à rien, je ne sais plus quoi faire par où regarder...
      end
    Quelqu'un à des exemples à proposer ?
    Merci

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Après avoir fait le Navigate il faut attendre que le navigateur ait fini de charger la page.
    Ensuite tu utilises la méthode getElementsByTagName de IHtmlElement2 pour extraire les éléments qui possède le tag voulu :

    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
     
    var
      doc : IHTMLDocument2;
      body : IHTMLElement2;
      list : IHTMLElementCollection;
    begin
      WebBrowser1.Navigate('http://www.developpez.com/');
      repeat
        Application.ProcessMessages;
        Sleep(20);
      until WebBrowser1.ReadyState = READYSTATE_COMPLETE;
      doc := WebBrowser1.Document as IHTMLDocument2;
      body := doc.body as IHTMLElement2;
      list := body.getElementsByTagName('LI');
      ShowMessage(IntToStr(list.length));
    end;
    Pour les attributs, tu castes l'élément dans l'interface qui correspond à l'élément HTML (IHTMLLIElement, IHTMLObjectElement...) et tu as toutes les propriétés de l'élément.

Discussions similaires

  1. Comment afficher un fichier HTML
    Par Xavier dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/03/2004, 07h56
  2. Comment lancer un fichier HTML ??
    Par Franck.H dans le forum Windows
    Réponses: 2
    Dernier message: 25/01/2004, 20h00
  3. Lancer un fichier html
    Par miss mary b dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 01/01/2004, 20h04
  4. Problème de rangement de structure dans un fichier ...
    Par Freeze dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/12/2003, 16h46
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 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