アプリ版:「スタンプのみでお礼する」機能のリリースについて

JSPで文字列を読み込み、一部編集してデータベースに出力させようとしています。現在、文字列の編集の部分でうまくいかず困っています。

<tr>
<td align="center"> </td>
<td align="center">C 1</td>
<td align="center">C 2</td>
</tr>
<tr>
<td><font color="#FFFFFF">_</font>コスト</td>
<td align="right"><font color="#FFFFFF">_</font>\ 200000<font color="#FFFFFF">_</font></td>
<td align="right"><font color="#FFFFFF">_</font>\ 300000<font color="#FFFFFF">_</font></td>
</tr>

の内容を読み込み、タグを取り除き<tr>ごとに次の行として
,C 1,C 2
_,コスト,_,\200000,_,_,\300000,_
のように出力したいのです。

現在、String型で"<td"や">"と指定し、substring()やindexOf()を使いやっているのですが、
<td align="right"><font color="#FFFFFF">_</font>\ 300000<font color="#FFFFFF">_</font></td>
のような、同じ行に2度出てくると初めしか文字列を取らなかったりしてうまくいきません。
違う方法や、アドバイスなどないでしょうか?また、XMLのDOMを使った方がいいのでしょうか?(XMLは全くわからないのですが、DOMを使えばもっと簡単にできるのでしょうか?)
よろしくお願いします。

A 回答 (2件)

おはようございます



文字列を駆使するよりは、char配列に分解してしまって、
状態遷移法的な解析をした方がスッキリしそうに思えます。


  public static void main(String[] args) {
    
    String htmlDoc=
        "<tr>"
      +  "<td align=\"center\"> </td>"
      +  "<td align=\"center\">C 1</td>"
      +  "<td align=\"center\">C 2</td>"
      +  "</tr>"
      +  "<tr>"
      +  "<td><font color=\"#FFFFFF\">_</font>コスト</td>"
      +  "<td align=\"right\"><font color=\"#FFFFFF\">_</font>\\ 200000<font color=\"#FFFFFF\">_</font></td>"
      +  "<td align=\"right\"><font color=\"#FFFFFF\">_</font>\\ 300000<font color=\"#FFFFFF\">_</font></td>"
      +  "</tr>";
      
    StringBuffer sbResult= new StringBuffer();
    char[] doc= htmlDoc.toCharArray();
    boolean tagFlg= false;  // true時はタグとして解析
    
    for (int i= 0; i< doc.length; i++){
      
      if (tagFlg== true){      // タグ読みモード
        
        // 終了文字'>'が来たらタグモード終了
        if (doc[i]== '>'){
          tagFlg= false;
        }
        continue;
        
      }
      else{            // テキスト読みモード
        
        // 開始文字'<'ならタグモードへ移行
        if (doc[i]== '<'){
          tagFlg= true;
          continue;
        }
        else{
          sbResult.append(doc[i]);
        }
      }
    }
    
    // 結果出力
    System.out.println(sbResult);
    
  }

▼コンソールに出てきた結果
 C 1C 2_コスト_\ 200000__\ 300000_

力尽きたのでタグ取り作業しかしていませんが、
タグモードの時に中身を一時バッファを溜め込んでおいて
テキストモードになった時、"/tr"は無視して、
"tr"を見つけたら改行コードを sbResult に追加書き込み
してやればいいですね。

でもやっぱり用意されているDOMライブラリ使った方が
ラクですしバグも出にくいと思います…。
HTMLドキュメント全体をツリー構造と捉えることが出来てますし、
後付編集なども可能ですから…。

参考までに私が依然使っていたHTMLParcerライブラリを張っておきます。
他にもXML/DOM/HTML等の解析ライブラリはあるので気に入ったものを探してみるのも良いと思います。

参考URL:http://people.apache.org/~andyc/neko/doc/html/
    • good
    • 0

DOMを使った方がいいと思います。



と、書いたところで、質問者さんの同様の質問に回答したものの、返答も締め切りもされていないことに気づいたので、これ以上のコメントは控えさせていただきます。

(DOMを使った方が・・・って私の前回の回答ですよね・・・?)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!