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

Java Discussion :

Identifier élément HTMLDocument


Sujet :

Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut Identifier élément HTMLDocument
    Bonjour bonjour,

    Je galère sur un problème tout bête, mais pourtant je n'arrive pas à trouver de solution :

    J'ai une String htmlString contenant du code html
    J'ai un HTMLDocument htmldoc

    Je veux remplir mon htmlDoc avec le contenu du htmlString, puis remplacer les balises <mathML ...> </mathML> et leur contenu par un JComponent.

    2 solutions :
    - soit j'intervient sur la htmlString, mais dans ce cas je ne sais pas à quel offset insérer mon JComponent dans le htmlDoc par la suite.

    - soit j'intervient directement dans le htmlDoc, mais je ne vois pas comment identifier ces balises ou l'Element associé et les remplacer par mon JComponent. Je n'ai pas l'id des éléments.

    Merci de votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Bon, je vais aborder le problème différemment :

    - Est-ce que quelqu'un sait comment obtenir le charactère associé à un Element (en grois, si je fais htmlDoc.getCharacterElement(i), comment je peux savoir de quel charactère il s'agit).

    - Est-ce que vous savez comment je peux faire une copie conforme d'un HTMLDocument ?

    Merci

  3. #3
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Si ça peut te mettre un peu sur la voie ?

    Obtenu sur goggle :
    Vous obtenez une instance de HtmlDocument via la propriété Document du contrôle WebBrowser.
    Exemple en C# :
    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
     
    private void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.DocumentText =
            "<html><body>Please enter your name:<br/>" +
            "<input type='text' name='userName'/><br/>" +
            "<a href='http://www.microsoft.com'>continue</a>" +
            "</body></html>";
        webBrowser1.Navigating += 
            new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
    }
     
    private void webBrowser1_Navigating(object sender, 
        WebBrowserNavigatingEventArgs e)
    {
        System.Windows.Forms.HtmlDocument document =
            this.webBrowser1.Document;
     
        if (document != null && document.All["userName"] != null && 
            String.IsNullOrEmpty(
            document.All["userName"].GetAttribute("value")))
        {
            e.Cancel = true;
            System.Windows.Forms.MessageBox.Show(
                "You must enter your name before you can navigate to " +
                e.Url.ToString());
        }
    }
    Exemple en VB :
    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
     
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
        Handles Me.Load
     
        webBrowser1.DocumentText = _
            "<html><body>Please enter your name:<br/>" & _
            "<input type='text' name='userName'/><br/>" & _
            "<a href='http://www.microsoft.com'>continue</a>" & _
            "</body></html>"
     
    End Sub
     
    Private Sub webBrowser1_Navigating( _
        ByVal sender As Object, ByVal e As WebBrowserNavigatingEventArgs) _
        Handles webBrowser1.Navigating
     
        Dim document As System.Windows.Forms.HtmlDocument = _
            webBrowser1.Document
        If document IsNot Nothing And _
            document.All("userName") IsNot Nothing And _
            String.IsNullOrEmpty( _
            document.All("userName").GetAttribute("value")) Then
     
            e.Cancel = True
            MsgBox("You must enter your name before you can navigate to " & _
                e.Url.ToString())
        End If
     
    End Sub

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Merci dragonno.

    Malheureusement, j'aurai du préciser le contexte dans ma question.

    Je travaille sur un logiciel local qui propose un traitement de texte HTML via un JTextPane auquel est attaché un HTMLDocument. Je ne crois pas pouvoir utiliser ton exemple dans ce contexte.

  5. #5
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Désolé :/

    Peut-être que le premier post de ce topic te donnera une idée ?

    Extrait :
    Je réalise un projet en JAVA, pour cela je dois d'abord récupérer des information à partir du web. J'ai pu réaliser la connexion avec la page web et récupérer les code source HTML dans un objet BufferReader. Et cela fonctionne bien.
    http://www.developpez.net/forums/d13...age-html-java/

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Merci pour ton aide. Malheureusement ce n'est toujours pas ce que je cherche.

    Je m'aperçois que ce qui serait idéal finalement, ce serait de pouvoir cloner le HTMLDocument. Sauf que je n'ai pas trouvé de moyen pour le faire correctement.

    - clone() n'existe pas pour cet objet
    - j'ai pensé à extraire le html et recréer un htmldoc à partir de ça, mais le résultat n'est pas exactement identique
    - HTMLEditorKit ne propose rien non plus.

    Des idées ?

  7. #7
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Et en parcourant l'objet avec une boucle afin de cloner chaque noeud ?

    (jamais fait)

    Et l'info sur java dit :


    Document clone()
    This will return a deep clone of this Document.

    Bizarre que ça marche pas.

    Essaie ça sinon :

    Document getDocument()
    Always returns this Document Instance

    Sinon copier le fichier :

    http://patatos.over-blog.com/article...-47353773.html

    Y a ça aussi :

    http://htmlparser.sourceforge.net/

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Oui, je n'ai pas précisé, pardon :
    clone() has protected access in java.lang.Object

    sinon, getDocument() ça sort d'où ? Je le vois pas dans les méthodes de HTMLDocument

    La copie de stream pourrait être une solution, mais le problème que j'essaie de régler et qui est à l'origine de ma question, c'est justement un problème de sauvegarde/chargement. Mon htmlDocument n'est pas sérializable à cause des listener et des JComponents qui lui ont été rajoutés. En dernier recours, je pourrais malgré tout essayer de tout sérializer, mais je préfèrerais éviter...

    Malgré tout, j'apprécie beaucoup ton aide. Merci encore.

  9. #9
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    On se croise, je viens d'éditer mon post pour ajouter un lien vers le parser en java

    Get document()
    http://docs.oracle.com/javase/1.4.2/...mentEvent.html

    Tu l'a là aussi d'une autre façon :
    Document getDocument(long docID)
    Returns the document with the specified docID.

    http://docs.jivesoftware.com/jive_sb...ntManager.html

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Citation Envoyé par dragonno Voir le message
    On se croise, je viens d'éditer mon post pour ajouter un lien vers le parser en java

    Get document()
    http://docs.oracle.com/javase/1.4.2/...mentEvent.html

    Tu l'a là aussi d'une autre façon :
    Document getDocument(long docID)
    Returns the document with the specified docID.

    http://docs.jivesoftware.com/jive_sb...ntManager.html
    Le premier est la méthode d'un DocumentEvent. Elle ne renvoie qu'un lien vers mon htmlDocument déjà existant.

    Le second est une classe d'une librairie externe, visiblement. Je ne sais pas à quoi elle sert, mais en tout cas, les fonctions getDocument renvoient là aussi l'adresse du document existant. Pas un nouveau document.

  11. #11
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Est-ce que ça peut t'aider ce topic ?

    http://stackoverflow.com/questions/1...string-in-java

    Ou celui-ci :
    Problem

    You have HTML in a Java String, and you want to parse that HTML to get at its contents, or to make sure it's well formed, or to modify it. The String may have come from user input, a file, or from the web.
    http://jsoup.org/cookbook/input/pars...nt-from-string

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Merci pour tes suggestions. Je pense que mon problème est pas très clair J'ai du mal à le mettre en mots.

    En fait, le problème quand tu utilises un HTMLDocument dans un éditeur de texte, tu as d'un côté la vision "éditeur" c'est à dire caractère par caractère, chaque caractère ayant des attributs, et le contenu texte, c'est uniquement ce que tu lis.

    De l'autre côté, tu as la vision HTML. Bonjour dans l'éditeur devient <html><head></head><body>Bonjour</body></html> dans la version html.

    Le coeur du problème, c'est que
    1) HTMLDocument ne propose aucun véritable moyen de faire le lien facilement entre les deux types de contenus.
    2) Le HTMLDocument tolère très bien qu'on lui insère des JComponent, mais ne propose aucune solution pour les faire apparaitre dans la version html

    Conclusion : Il faut faire sois-même la conversion des JComponent, ce qui, en soit n'est pas très dur. Mais ce qui est impossible c'est d'obtenir la position du JComponent dans le contenu html en connaissant sa position dans le contenu de l'éditeur.

    En bref, j'ai dans l'éditeur : Bon[JComponent]jour
    en html j'ai : <html><head></head><body>Bon jour</body></html>
    Je voudrais : <html><head></head><body>Bon<mathML>...</mathML>jour</body></html>
    Mais je ne sais pas comment récupérer la position où insérer ma chaine html

  13. #13
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Je ne connais pas bien java donc je te donne la correspondance grossière en DOM.
    En encadrant ton jcomponent dans un div avant de le placer dans le document, tu pourrais retrouver le div par son id puis avoir accès à son contenu.

    C'est faisable ?

  14. #14
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    C'est pas bête ça ! Je sais pas si je peux faire ça parce que pour insérer le JComponent je dois utiliser une méthode spéciale du HTMLDocment et pour insérer du html je dois utiliser une méthode différente. Mais je peux peut-être insérer une balise <div> ou <span> vide puis insérer le JComponent au milieu.

    Dans le cas de bon[JComponent]jour, est-ce que je devrais utiliser div ou span selon toi pour encadrer le JComponent sans créer de retour à la ligne ou de séparation visible entre "bon", le JComponent, et "jour".

    Merci beaucoup en tout cas !!! J'ai l'impression de sortir enfin du trou .

  15. #15
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    le span permet d'éviter le retour à la ligne, normalement...

  16. #16
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Ok. J'ai essayé de toutes les façons possibles, j'arrive pas à insérer mon JComponent au milieu de mon span...

    Je vois 3 façon de faire ça :

    1 - Créer un objet HTMLElement span, puis mettre mon JComponent dans l'Element, puis insérer le tout dans le HTMLDocument.

    2 - rajouter la propriété "span" dans l'attributeSet du charactère représenté par mon component, puis insérer le résultat avec insertString(offset, string, attributes)

    3 - Insérer des balises span via EditorKit.insertHTML, puis se débrouiller pour insérer le component au milieu.

    Mes problèmes :

    1 - Je n'arrive pas à créer ni à insérer un Element dans mon HTMLDocument. Vous savez comment faire ?

    2 - Est-ce qu'on peut faire ça ? Comment on ajoute une telle propriété ?

    3 - Si je crée une balise span qui ne contient rien, elle est automatiquement supprimée. Si je remplace le contenu, elle est aussi supprimée. Je dois donc la créer avec un caractère, puis lui ajouter les bons attributs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    editorKit.insertHTML(htmldoc, position, "<span id='test'>&nbsp;</span>", 0, 0, Tag.SPAN);
    sdoc.setCharacterAttributes(position, 1, attrs, false);
    Cependant, l'effet de la deuxième ligne ne devient visible que lorsque je saisis un nouveau charactère... Quelqu'un voit pourquoi ? Est-ce qu'il faut raffraichir le TextPane ? Mais repaint() ne donne aucun résultat...

    Help !

  17. #17
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Là je cale, vu que je suis un nase en java :/
    Espérons que quelqu'un de bon en java puisse t'aider ...

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Bon, ok, je me focalise sur la méthode 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    editorKit.insertHTML(htmldoc, position, "<span id='test'>&nbsp;</span>", 0, 0, Tag.SPAN);
    sdoc.setCharacterAttributes(position, 1, attrs, false);
    QUESTION :
    Comment raffraichir l'affichage de mon character après l'ajout des nouveaux attributes ?

    Merci de votre aide

  19. #19
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Bein comme c'est sur une page internet, la seule solution c'est de recharger la page, je ne sais pas si c'est compatible avec ton projet...

  20. #20
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    En fait c'est pas sur une page internet. C'est sur un JTextPane dans un logiciel qui propose un traitement de texte. Pour une exportation plus aisée des données, le Document du JTextPane est un HTMLDocument plutôt qu'un StyledDocument.

    Personnellement, j'envisageais repaint, mais il semble que ce n'est pas la solution. Pour le moment je n'ai rien trouvé de mieux que la solution assez décevante d'ajouter/enlever un character après mon insertion...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        editorKit.insertHTML(sdoc, position, "<span id='test'>&nbsp;</span>", 0, 0, Tag.SPAN);
        htmldoc.setCharacterAttributes(position, 1, attrs, false);
        htmldoc.insertString(position+1, " ", null);
        htmldoc.remove(position+1, 1);
    Triste.

    Même si ça résout le problème, je préfère laisser le topic ouvert dans l'espoir que quelqu'un ait une meilleure solution à proposer.

    Un grand merci, Dragonno. Ca m'a beaucoup aidé de pouvoir structurer ma réflexion en échangeant avec toi.

Discussions similaires

  1. identifier l'élément qui a reçu le clic
    Par sebac dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 29/03/2010, 11h36
  2. Réponses: 2
    Dernier message: 17/01/2010, 15h29
  3. [AC-2002] Identifier éléments impactés
    Par Zopla dans le forum Modélisation
    Réponses: 1
    Dernier message: 12/01/2010, 18h48
  4. Réponses: 9
    Dernier message: 08/12/2009, 18h26
  5. Identifier l'élément courant actif ?
    Par agoubi dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/08/2007, 16h12

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