Java htmlテキストのコメント内容を削除する


最近のプロジェクトでは、外部htmlテキストファイルを読み込む機能があります.しかしhtmlファイルには多くのコメントがあり、そのコメントを削除して保存する必要があります.実はhtmlのテキストの中の注釈を削除するのは多くの方法があって、ここで自分で勝手に1つの処理方法を書いて、ノートになる権利があって、必要な学生は参考にすることができます.
htmlテキストの注釈にはいくつかの特徴があります.
1.ペアで現れ、始まりがあれば必ず終わりがある.
2.アノテーションラベルはネストされていません.アノテーション開始ラベル(以下、)です.
3.1行に複数のコメントラベルペアがある場合があります.
4.コメントは改行することもできます.
次のような状況があります.

<html>
<!--This is a head-->
<head>A Head</head>
<!--This is 
   a div -->
<div>A Div</div>
<!--This is 
    a span--><!--span in 
    a div--><div>a div</div>
<div><span>A span</span><div>

<!--This is a 
        span--><div>A div</div><!--span in a div-->
<div><span>A span</span><div>
<html>

考え方:
1.テキストを1行ずつ読み込みます.
2.行にの前に.2つのラベル間のコメント内容を直接削除し、他の内容を取得します.
3.行にの後にあります.2つのラベルの間の内容を取得し、注記が4.行にのみが含まれている場合は、ラベルの後ろの内容を取得し、-->ラベルに遭遇したことをマークします.
6.行の残りの内容について、2,3,4,5のステップを実行します.
7.残りの内容を保存します.
8.次の行を読み込みます.
直接コード:

    public class HtmlCommentHandler {
        /**
         * html      Detector
         * 
         * @author boyce
         * @version 2013-12-3
         */
        private static class HtmlCommentDetector {

            private static final String COMMENT_START = "<!--";
            private static final String COMMENT_END = "-->";

            //        html   ,              "<!-- -->"
            private static boolean isCommentLine(String line) {

                return containsCommentStartTag(line) && containsCommentEndTag(line) 
                    && line.indexOf(COMMENT_START) < line.indexOf(COMMENT_END);
            }

            //            
            private static boolean containsCommentStartTag(String line) {
                return StringUtils.isNotEmpty(line) &&
 line.indexOf(COMMENT_START) != -1;
            }

            //            
            private static boolean containsCommentEndTag(String line) {
                return StringUtils.isNotEmpty(line) &&
 line.indexOf(COMMENT_END) != -1;
            }

            /**
             *           
             */
            private static String deleteCommentInLine(String line) {

                while (isCommentLine(line)) {
                    int start = line.indexOf(COMMENT_START) + COMMENT_START.length();
                    int end = line.indexOf(COMMENT_END);
                    line = line.substring(start, end);
                }
                return line;
            }

            //              
            private static String getBeforeCommentContent(String line) {
                if (!containsCommentStartTag(line))
                    return line;

                return line.substring(0, line.indexOf(COMMENT_START));
            }

            //             
            private static String getAfterCommentContent(String line) {
                if (!containsCommentEndTag(line))
                    return line;

                return line.substring(line.indexOf(COMMENT_END) + COMMENT_END.length());
            }
        }
        
        /**
         *   html  ,    
         */
        public static String readHtmlContentWithoutComment(BufferedReader reader) throws IOException {
            StringBuilder builder = new StringBuilder();
            String line = null;

            //          
            boolean inComment = false;
            while (ObjectUtils.isNotNull(line = reader.readLine())) {

                //         
                while (HtmlCommentDetector.containsCommentStartTag(line) || 
                        HtmlCommentDetector.containsCommentEndTag(line)) {

                    //                  
                    // <!-- comment -->
                    if (HtmlCommentDetector.isCommentLine(line)) {
                        line = HtmlCommentDetector.deleteCommentInLine(line);
                    }

                    //        ,               ,             
                    // xxx -->content<!--
                    else if (HtmlCommentDetector.containsCommentStartTag(line) && HtmlCommentDetector.containsCommentEndTag(line)) {
                        //         ,         ,    inComment   true
                        line = HtmlCommentDetector.getAfterCommentContent(line);
                        line = HtmlCommentDetector.getBeforeCommentContent(line);
                        inComment = true;
                    }

                    //          ,           ,            inComment
                    // content <!--
                    else if (!inComment && HtmlCommentDetector.containsCommentStartTag(line)) {
                        //   inComment    true。           
                        inComment = true;
                        line = HtmlCommentDetector.getBeforeCommentContent(line);
                    }

                    //          ,           ,          inComment
                    // -->content
                    else if (inComment && HtmlCommentDetector.containsCommentEndTag(line)) {
                        //   inComment    false。           
                        inComment = false;
                        line = HtmlCommentDetector.getAfterCommentContent(line);
                    }

                    //           
                    if (StringUtils.isNotEmpty(line))
                        builder.append(line);
                }

                //                 inComment = false  
                if (StringUtils.isNotEmpty(line) && !inComment)
                    builder.append(line);
            }
            return builder.toString();
        }
    }

もちろん、他にもいろいろな方法がありますが、正則マッチングで削除したり、Stackタグで終了したりすることもできます.
など、以上のコードはテストして使用して、必要な学生に役に立つことを望んでいます.