Java HTML解析 〜Wikipedia 武器 ページの解析3〜

前回は、目次の表示を行いました。

しかし、このままでは、インデックスがちゃんと表示されないので、インデックスをちゃんと表示できるように一工夫する必要があります。

インデックスがうまくいかない

前回のコードでは、「id=toc」のタグを取得してから中にあるタグを単純に表示するだけです。というか表示用のメソッドの記述がありませんでした。

それは、インデックスをちゃんと表示するためのメソッドを用意したためです。
対象になる部分は以下のような処理です。

// System.out.println("*** Get Content ***");
Elements eles = doc.getElementById("toc").children();
for (int i = 0; i < eles.size(); i++) {
    Element item = eles.get(i);
    printIndex(item, i);
}

「printIndex(item, i);」の部分です。
このメソッドを下のように変更すると単純にタグの中身を表示できます。
System.out.println(item.text());

インデックスの処理

結論から言うと、インデックス部分かどうかの判定をして、インデックスであれば。。。と言う処理を行ってやれば良いと言うところですが、ちょっと面倒でした。

作成した処理は以下のようなものになります。
Gitにアップしてあります

private void printIndex(Element row, int num) {
//      System.out.println("index" + num + ": " + row.text());
    if (row.childrenSize() != 0) {
        printChild(row.children());
    }
}

private void printChild(Elements eles) {
    for (Element ele: eles) {
        if (ele.childrenSize() != 0) {
            printChild(ele.children());
        } else {
            printElement(ele);
        }
    }
}
private void printElement(Element ele) {
    if (ele.text().contains(".")) {
        print(ele,"-   ", ": ");
    } else if (ele.text().matches("[0-9]{1,2}")) {
        print(ele,"", ": ");
    } else {
        if (ele.text().equals("")) {
            return;
        }
        println(ele, "", "");
    }
}
private void print(Element ele, String prefix, String safix) {
    if (safix != "") {
        System.out.print(ele.text() + safix);
    } else {
        System.out.print(prefix + ele.text());
    }
}
private void println(Element ele, String prefix, String safix) {
    if (safix != "") {
        System.out.println(ele.text() + safix);
    } else {
        System.out.println(prefix + ele.text());
    }
}

メソッド呼び出しの順番は以下のようになっています。

  1. printIndex(): タグの子供を取得
  2. printChild(): タグの子供がいる場合は再起処理、そうでない場合は文字を取得して表示
  3. printElement(): ⑴を参照
  4. print(改行なし) or println(改行あり)
⑴ 以下のような条件分岐を行う
A. 文字列に「.」を含む場合
B. 文字列が「0-9」の数字の場合
C. 上記以外の場合

それぞれに対し、下のような処理を行います。※改行しない場合

       if (safix != "") {
            System.out.print(ele.text() + safix);
        } else {
            System.out.print(prefix + ele.text());
        }

表示する文字の手前(prefix)とあと(safix)に値があればそれを表示すると言う処理を行っています。

このプログラムで、取得した値は以下のように表示されます。

*** execute ***
*** Get Content ***
目次
1: 武器のエネルギー
1.1: 運動エネルギー
1.2: 人力
1.3: 火・燃焼
1.4: 生物(兵器)
1.5: 電気
1.6: 光線
1.7: 毒・化学物質
1.8: その他
2: 武器の構造
2.1: 柄
2.2: 柄頭
2.3: 刃
2.4: 刀身・剣身
2.5: 鎖物・縄
2.6: 鉤
2.7: 暗器
2.8: 機械
3: 歴史
3.1: 石器・自然物
3.2: 金属製武器の登場
3.3: 銃の登場
3.4: 近代
3.5: 第二次大戦後
4: 日本の武器の歴史
4.1: 古代
4.2: 中世
4.3: 近世
4.4: 近代
4.5: 現代
4.6: 現在
5: 玩具としての武器
6: スポーツに用いられる武器
7: 象徴・祭器としての武器
8: 架空の武器
9: 武器の分類
10: 主な武器の種類
10.1: 刀剣類
10.2: 鈍器類
10.3: 竿状武器(ポールウェポン)
10.4: 投擲武器
10.5: 射出武器
10.5.1: 暗器・格闘武器
10.6: その他の武器
11: 脚注
12: 参考文献
13: 関連項目
14: 外部リンク

でわでわ。。。

関連ページ

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 9Training of for statement
  11. Java Basic Level 10 While statement 
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1
  17. Java Basic JUnit 〜テストスイートの作り方〜