JavaマスターJavaプログラムサンプル集文字列, 日本語処理のサンプル → HTMLファイルやXMLファイルを読み込む

HTMLファイルやXMLファイルを読み込む

HTMLファイルやXMLファイルをタグ単位に分解しながら読み込むクラスです。

HTMLファイルやXMLファイルなどを読み込んで内容を解析することができる本格的なライブラリは たくさんありますが、ここでは、簡易型のHTML/XMLパーサをご紹介します。

(以下、XMLという記述を省略しますが、XMLファイルも処理することができます。)

まず、HTMLを構成する「タグ」をTagクラスにて定義します。 このTagクラスでは、タグというものを以下のような構造であると仮定しています。

<タグ名 属性名1=属性値1 属性名2=属性値2 ・・・> テキスト・・・

終了タグ(「</html>」など)は、 タグ名がスラッシュ(/)で始まり、 テキストや属性を持たないタグであると考えます。

samples/string/html/Tag.java - Eclipse SDK
package samples.string.html;

public class Tag {
  private String tagStr;

  private String tagName;

  private String tagAttribute;

  private String tagText;

  public Tag(String tagStr, String tagName, String tagAttribute,
      String tagText) {
    this.tagStr = tagStr;
    this.tagName = tagName;
    this.tagAttribute = tagAttribute;
    this.tagText = tagText;
  }

  @Override
  public String toString() {
    return "タグ:[" + tagName + "], 属性:[" + tagAttribute + "], テキスト: ["
        + tagText + "]";
  }

}

次は、HTMLファイルのソースを受け取って、上記のタグを ひとつずつ読み取るHTMLParserクラスです。

samples/string/html/HTMLParser.java - Eclipse SDK
package samples.string.html;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HTMLParser {
  /**
   * タグの正規表現
   */
  private static Pattern tagPattern = Pattern
      .compile("(<([^ >]+)([^>]*)>)([^<]*)");

  private Matcher matcher;

  private Tag tag;

  int pos;

  /**
   * コンストラクタです。
   
   @param src
   *            HTMLソース
   */
  public HTMLParser(String src) {
    matcher = tagPattern.matcher(src);
  }

  /**
   * 次のHTMLタグがあるかどうかを検査します。
   
   @return 存在する場合はtrue
   */
  public boolean hasNext() {
    boolean found = matcher.find();
    if (found) {
      tag = new Tag(matcher.group(1), matcher.group(2), matcher.group(3),
          matcher.group(4));
    }
    return found;
  }

  /**
   * 次のHTMLタグを返します。
   
   @return タグをあらわすオブジェクト
   */
  public Tag next() {
    return tag;
  }

  public static void main(String[] args) {

    // サンプルのHTMLを用意します。
    StringBuffer sb = new StringBuffer();
    sb.append("<html>");
    sb.append(" <head>");
    sb.append("  <title>JavaMasterのお店</title>");
    sb.append(" </head>");
    sb.append(" <body>");
    sb.append("  <h1>JavaMasterへようこそ!</h1>");
    sb.append("  <p>おいしいコーヒーの");
    sb.append("     通信販売を行っています。");
    sb.append("  <!-- 会員用入り口 -->");
    sb.append("  <a href='login.jsp'>ログイン</a>");
    sb.append(" </body>");
    sb.append("</html>");

    // パーサオブジェクトを作成します。
    HTMLParser parser = new HTMLParser(sb.toString());

    // タグを順番に処理します。
    while (parser.hasNext()) {
      Tag tag = parser.next();
      System.out.println(tag);
    }
  }
}

HTMLParserの使い方は以下のとおりです。

まず、ローカルやネットワークのHTMLファイルを 読み込み、その文字列をHTMLParserのコンストラクタに渡して HTMLParserオブジェクトを作成します。

(このサンプルでは、その部分を省略するため、プログラム内で適当なHTMLソースを作っています。)

そして、hasTextメソッドで、まだ読み込むタグがあるかどうかを 調べ、次にnextメソッドで次のタグを取り出し、・・・という動作を ループで実行します。

このサンプルでは、取り出したタグをただ単に表示していますが、 たとえば、リンクや画像のタグだけを抜き出したり、 開始タグと終了タグの対応(タグの閉じ忘れ)を調べたりするなど、 工夫次第でいろいろな処理を行うことができるでしょう。

実行結果は以下のようになります。

コマンド プロンプト

C:\JavaMaster\bin>java -cp . samples.string.html.HTMLParser 
タグ:[html], 属性:[], テキスト: [ ]
タグ:[head], 属性:[], テキスト: [  ]
タグ:[title], 属性:[], テキスト: [JavaMasterのお店]
タグ:[/title], 属性:[], テキスト: [ ]
タグ:[/head], 属性:[], テキスト: [ ]
タグ:[body], 属性:[], テキスト: [  ]
タグ:[h1], 属性:[], テキスト: [JavaMasterへようこそ!]
タグ:[/h1], 属性:[], テキスト: [  ]
タグ:[p], 属性:[], テキスト: [おいしいコーヒーの     通信販売を行っています。  ]
タグ:[!--], 属性:[ 会員用入り口 --], テキスト: [  ]
タグ:[a], 属性:[ href='login.jsp'], テキスト: [ログイン]
タグ:[/a], 属性:[], テキスト: [ ]
タグ:[/body], 属性:[], テキスト: []
タグ:[/html], 属性:[], テキスト: []