Tout d'abord, deux cas possibles. Le fichier HTML est manipulé localement en ouvrant directement ce dernier sous forme d'un objet File. Soit, il s'agit d'une réponse liée à une connexion HTTP via une URL.
Dans les deux cas, pour le bon fonctionnement de cette solution, il faut aboutir en premier à un flux d'entré de type InputStream.
Dans le cas d'un fichier ça donne :
FileInputStream fluxEntree = new FileInputStream(new File("chemin complet vers votre fichier html"));
Dans le cas d'une URL de type HTTP, ça donne ça :
1 2
| URL url = new URL("votre url HTTP");
InputStream fluxEntree = url.openStream(); |
Maintenant que nous tenons notre flux d'entrée, passons à JEditorPane.D'abord, on se fait une instance spécifique pour le HTML de JEditorPane :
JEditorPane extracteur = new JEditorPane("text/html", null);
Ensuite, il faut instancier un objet de type HTMLDocument pour héberger le code HTML que l'on va lire :
HTMLDocument documentHTML = new HTMLDocument();
puis lire le flux et remplir notre documentHTML :
extracteur.read(fluxEntree, documentHTML);
Maintenant, il suffit de raisonner avec notre documentHTML comme s'il s'agissait d'une arborescence de type JTree. Attention, je préciserai une chose essentielle, il est impératif que le code HTML soit CLEAN. Des balises non fermées ne gêneront pas l'affichage de la page, mais son interrogation s'en verra évidement fortement compromise. En effet, l'organisation interne du documentHTML est conditionné sous forme d'arborescences imbriquée. Le noeud HTML contient généralement les noeuds TITLE, BODY etc. Puis le noeud BODY qui ici nous interresse contient lui des eléments (les balisages qu'il encadre parmis lesquels nous allons rechercher la balise planet-name).
Pour ce faire, nous allons commencer par pointer notre block d'eléments principale représenté par le jeux de balises <HTML>...</HTML> ainsi :
HTMLDocument.BlockElement racineHTML = (HTMLDocument.BlockElement)documentHTML.getDefaultRootElement();
On en profite pour préparer deux objets HTMLDocument.BlockElement qui vont servir à récupérer la valeur contenue dans le balisage recherché :
HTMLDocument.BlockElement elementTrav = null, elementBody = null;
Comme notre balisage planet-name se trouve dans le balisage <BODY>...</BODY>, on va d'abord récupérer le block d'elément BODY :
1 2 3 4 5
| int positionBody = -1;
for (int i = 0 ; i < racineHTML.getElementCount() ; i++) {
if (racineHTML.getElement(i).getName().equalsIgnoreCase("body")) positionBody = i;
}
elementBody = (HTMLDocument.BlockElement)racineHTML.getElement(positionBody); |
Maintenant, il ne reste plus qu'à lire le bloque d'elements BODY et de ne s'interresser qu'à la balise planet-name : Attention, je préciserai ici qu'il devient necéssaire que cette dernière soit directement dans la balise BODY, pas dans un TABLE ou un FORM. Donc par rapport à votre code HTML, je ne sais pas si ça colle ?
1 2 3 4 5 6 7
| for (int i = 0 ; i < elementBody.getElementCount() ; i++) {
if (elementBody.getElement(i).getName().equalsIgnoreCase("span")) {
// Il ne reste plus qu'à récupérer la valeur de l'attribut class de la balise span, histoire de ne s'interresser qu'à planet-name.
// Dans un premier temps, il faudra récupérer l'offset de départ et celui de fin du texte hors balisage en récupérant le span sous la forme d'un RunElement, et non d'un BlockElement.
// On peut alors récupérer le texte contenu par la méthode getDocument().getText(offsetdebut, offsetfin - offsetdebut) du RunElement.
}
} |
Désolé pour la finalité, je vous laisse chercher un peu, je n'ai plus le temps de poursuivre, mais je penses que l'idée est interessante. Je préciserai aussi que je n'ai pas testé ce code, mes explications sont issue d'une utilisation personnelle de JEditorPane que j'ai fait pour extraire dans différents formats (xls, xml, csv, etc...) des tableaux de résultats sportifs contenus dans des pages HTML sous forme de <TABLE...>...</TABLE>.
Partager