2017-08-20 28 views
0

私はJavaの専門家ではないことにご注意ください。可能であれば、助けと指導をお願いします。複数のHTMLテーブル行のJavaループ

ファイルの内容を読み込んで、JSOUPを使用してhtmlに解析するJavaコードがあります。私はその後、JSONにテーブルを変換する必要があります。最初の行は正常に変換されますが、次の行は変換されません。

シンプルなものが欠けていると私は確信しています。

私のプログラム以下:JSONに変換する必要が

package html_to_json_parser; 

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import org.json.JSONObject; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 


public class HTML_to_JSON_parser { 


public static void main(String[] args) throws IOException { 

    InputStream is = new FileInputStream("skills_table.html"); 
    BufferedReader buf = new BufferedReader(new InputStreamReader(is)); 
    String line = buf.readLine(); 
    StringBuilder sb = new StringBuilder(); 

    while(line != null){ 
     sb.append(line).append("\n"); 
     line = buf.readLine(); 
    } 

    String htmlFile = sb.toString(); 

    Document doc = Jsoup.parse(htmlFile); 
    JSONObject jsonObject = new JSONObject(); 
    JSONObject jsonParentObject = new JSONObject(); 
    Element table = doc.select("table").first(); 
    Elements row = table.getElementsByTag("tr");   

     for (int j = 0, k = row.size(); j < k; j++) { 

      Elements cols = row.select("td"); 
      String skill = cols.get(0).text(); 
      String beginner = cols.get(1).text(); 
      String intermediate = cols.get(2).text(); 
      String advanced = cols.get(3).text(); 
      jsonObject.put("Beginner", beginner); 
      jsonObject.put("Intermediate", intermediate); 
      jsonObject.put("Advanced", advanced); 
      jsonParentObject.put(skill,jsonObject); 
     } 

    System.out.println(jsonParentObject.toString()); 

    } 

} 

HTMLテーブル:

<table> 
 
    <thead> 
 
    <tr> 
 
     <th>Skill</th> 
 
     <th>Beginner</th> 
 
     <th>Intermediate</th> 
 
     <th>Advanced</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody> 
 
    <tr> 
 
     <td>Reading</td> 
 
     <td>✔</td> 
 
     <td>✔</td> 
 
     <td>✔</td> 
 
    </tr> 
 
    <tr> 
 
     <td>Speaking</td> 
 
     <td>◯</td> 
 
     <td>✔</td> 
 
     <td>✔</td> 
 
    </tr> 
 
    <tr> 
 
     <td>Writing</td> 
 
     <td>◯</td> 
 
     <td>◯</td> 
 
     <td>✔</td> 
 
    </tr> 
 
    <tr> 
 
     <td>Interacting</td> 
 
     <td>●</td> 
 
     <td>●</td> 
 
     <td>● ●</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

は、JSONの出力が必要:

[ 
    { 
     "skill": "reading", 
     "beginner": "✔", 
     "intermediate": "✔", 
     "advanced": "✔" 
    }, 
    { 
     "skill": "writing", 
     "beginner": "◯", 
     "intermediate": "✔", 
     "advanced": "✔" 
    }, 
    { 
     "skill": "speaking", 
     "beginner": "◯", 
     "intermediate": "◯", 
     "advanced": "✔" 
    }, 
    { 
     "skill": "interacting", 
     "beginner": "●", 
     "intermediate": "●", 
     "advanced": "● ●" 
    } 
] 

あなたのご指導とご協力をよろしくお願い申し上げます。

+0

これは 'row.sizeを(返すんどう) ' –

+0

こんにちは@SagarRohankar、それは5行のために5を返します。 – FireHawk2300

答えて

1
Element table = doc.select("tbody").first(); 

代わりに "表" の上記のような

そして

Elements cols = row.eq (j).select("td"); 

変更 "TBODY" を置き換え、ここでは、j番目のtr要素と抽出の詳細情報を取得するために逃しました。また

JSONObject jsonObject = new JSONObject(); 

うわ...大きな間違いに動作します

ところで、あなたも(getを使用することができます)の代わりに等量の()。あなたはforループ内の開始の上に置く。 forループごとに同じオブジェクトのパラメータを更新するだけなので、最後に更新された詳細が得られます。

+0

こんにちは@Vinujan。 S、ありがとう、それを試みた。まだ最初の行だけを変換します: "読んでいる"。 – FireHawk2300

+0

編集済み、動作確認済み –

+0

ありがとうございました。現在、各行をループしていますが、最後の行から他のすべての行に列(「td」)のみを適用しています。 – FireHawk2300

0

あなたが再びここに何度も同じ行を使用している:

Elements row = table.getElementsByTag("tr");   

for (int j = 0, k = row.size(); j < k; j++) { 
    Elements cols = row.select("td"); 

をあなたはすべてのループを右の行を取得する必要があります。

Elements cols = row.get(j).select("td"); 
関連する問題