Sqs
Bonjour,
Ce que tu veux, c'est récupérer pour chaque TR le contenu des TD associés dans le but de les injecter dans un JTable ou comment faire pour ajouter des lignes / colonnes dans un JTable?
Pour la première partie, tu dois normalement récupéré une page html, via un GET / POST (en utilisant le package java.net / lecture d'un fichier sur le disque). Apparement, cette partie la est faite.
Tu as deux possibilités ensuite :
- Utiliser une solution de recherche à base de pattern / regexp (bien si tu fait peu de parsing html dans ton application)
- Utiliser un framework permettant de parser du code HTML (comme JERICHO, très simple d'utilisation http://sourceforge.net/projects/jerichohtml/). Il te fournira des méthodes d'accès pour manipuler du code HTML (récupérer un objet TABLE, l'ensemble des élements TR de ce table, l'ensemble des éléments TD de chaque élément TR, leur contenus texte, etc.)
Quelque soit la solution, ça ne sert strictement à rien de sauvegarder le contenu du table pour ensuite manipuler / injecter les données dans le JTable. En supposant que tu utilises Jericho , il te suffit juste :
- Recuperer l'objet table te concernant dans la page via JERICHO et créer un tableau a deux dimensions (String[][] trValues) qui va contenir pour chaque ligne TR , un tableau representant les valeurs des TD contenus.
- Récupérer la liste des TR via JERICHO (méthode findAllElements sur l'objet table)
- Pour chaque TR, récupérer la liste des TD via JERICHO (méthode findAllElements sur l'objet TR courant) et créer un tableau du genre String tdValues[NB_TD] qui va contenir les valeurs des tds de la ligne courante
- Pour chaque TD, ajouter la valeur dans le tableau tdValues
Utiliser le constructeur JTable(Object[][] rowData, Object[] columnNames) pour créer ton JTable.
Voila de tête une idée d'implémentation.
Héhéhé je comprends mieux
Et ton tp impose l'utilisation d'expressions régulières ? Ou tu peux utiliser autre chose?
Est ce que c'est un tableau assez simple pour l'exemple, ou dois tu gérer les colspan, le fait que le tableau puisse être mal formé, les entêtes (TH) etc.. ?
Je veux bien t'aider yep, tu veux un coup de main sur les expressions régulières en gros?
Si c'est ça, te faudrait deux expressions régulières :
- pour récupérer une liste de TR avec leurs attributs
- pour récupérer une liste de TD avec leurs attributs
Ton prof t'a filé une grammaire simplifiée pour l'exercice ou on doit considérer l'ensemble des options utiles d'un TR / TD / TH ?
salut,
tu pourrais faire ceci
d'abord tu crée 2 vecteurs, le premier qui contiendra les données du tableau, le deuxième contiendra les noms de colonnes
après, puisque tu as déjà le contenu de ta balise table, tu récupères ligne de ta table, et tu ajoutes chaque ligne à ton vecteur data
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Vector data = new Vector(); Vector columnNames = new Vector(); columnNames.add("Num");columnNames.add("Nom Prénom"); columnNames.add("Adresse");columnNames.add("Identifiant"); columnNames.add("Année");
et puis tu crée ton JTable en lui passant les 2 vecteurs créés
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 static void extraireLignes(String table) { Pattern p = Pattern.compile(".*?<tr[^>]*>(.*?)</tr>.*?"); Matcher m = p.matcher(table); while (m.find()) { ajouterLigne(m.group(1)); } } static void ajouterLigne(String ligne) { Vector lineData = new Vector();//vecteur qui contiendra les cellules de la ligne Pattern p = Pattern.compile(".*?<td[^>]*>(.*?)</td>.*?"); Matcher m = p.matcher(ligne); while (m.find()) { lineData.add(m.group(1)); } data.add(lineData); } public void copierDepuisUneUrl(String uneUrl, String uneAdresseLocale) throws IOException { .... while(m.find()) { extraireLignes(m.group(1)); } ...... }
Re, après une petite tartiflette, ca va toujours mieux
Et bien, si c'est juste la construction du JTable, comme je te le disais, c'est assez simple, un tableau de String pour les entêtes des colonnes, un tableau a deux dimensions qui va contenir les lignes / colonnes
Voila un petit exemple sur une table toute simple avec 2 colonnes / 2 Lignes (le code html est en dur dans le source)
C'est juste pour donner une idée, faut le repenser pour que ce soit propre aux niveaux de l'utilisation des groupes de regexp etc
Il faudra aussi gérer le fait qu'on peut avoir des balises comme <b>, <i>, etc dans le contenu du td (pour ce qui est du colspan, tu peux laisser tomber, vu qu'il faut le même nombre de colonnes dans le contexte de ton exercice)
Ps : Syntaxe java 1.4, si tu bosses en 1.5 et +, faut penser à typer les Listes etc
Mais dans l'ensemble, ton code devra ressembler à ça.
Bon courage et si tu as besoin, hésites pas à me contacter par MP / via ce post
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 String htmlContent = "<table><tr><td>1.1</td><td>1.2</td></tr><tr><td>2.1</td><td>2.2</td></tr></table>"; try { String TR_PATTERN = "<tr[^>]*>(.*?)</tr>"; String TD_PATTERN = "<td[^>]*>(.*?)</td>"; Pattern pTR = Pattern.compile(TR_PATTERN); Pattern pTD = Pattern.compile(TD_PATTERN); Matcher mTR = pTR.matcher(htmlContent); Matcher mTD = null; List trs = new ArrayList(); while (mTR.find()) { String currentTR = htmlContent.substring(mTR.start(), mTR.end()); mTD = pTD.matcher(currentTR); List tds = new ArrayList(); while (mTD.find()) { tds.add(mTD.group(1)); } trs.add(tds.toArray(new String[0])); } String[] headers = {"titreCol1","titreCol2"}; String [][] content = new String[trs.size()][]; for (int i=0;i<trs.size();i++) { content[i] = (String[])trs.get(i); } JTable jt = new JTable(content,headers); } catch (PatternSyntaxException pse){ pse.printStackTrace(); }
EDIT : Owned à 2 minutes par Herch ^^
tu as déjà posté la question sur comment enlever les balises. tu n'as qu'à appliquer la réponse au résultat que tu obtiens quand tu récupères le contenu des balises td
Bonsoir,
Pour les entêtes de colonnes, c'est soit des éléments TH, soit des élements TR contenus dans tbody (comme dans ton exemple). Il suffit donc de rajouter une petite expression régulière et le tour est joué.
Espérons que ça te donne une bonne note et que ton prof passe pas sur le forum
Ps : J'ai répondu à ton MP![]()
Partager