0

やあみんな、私は与えられたHTMLドキュメントが整形式であるかどうかを判断する必要があります。
JavaコアAPIクラスのみを使用する単純な実装が必要です。つまり、JTIDYなどのサードパーティのものは必要ありません。

実際に必要なのは、TAGのリストをスキャンするアルゴリズムです。オープンタグが見つかり、次のタグが対応するクローズタグではない場合は、別のオープンタグである必要があり、次のタグとしてクローズタグが必要です。そうでない場合は、別のオープンタグである必要があります。次に対応するクローズタグ、およびリスト上で次々に来る逆の順序で前のオープンタグのクローズタグ。リストがこの順序に準拠している場合は、trueまたはfalseを返します。タグをクローズタグに変換するメソッドはすでに作成しました。

これが私がすでに取り組み始めたもののスケルトンコードです。あまりきれいではありませんが、私がやろうとしていることの基本的な考え方を皆さんに提供するはずです。

public boolean validateHtml(){

    ArrayList<String> tags = fetchTags();
    //fetchTags returns this [<html>, <head>, <title>, </title>, </head>, <body>, <h1>, </h1>, </body>, </html>]

    //I create another ArrayList to store tags that I haven't found its corresponding close tag yet
    ArrayList<String> unclosedTags = new ArrayList<String>();

    String temp;

    for (int i = 0; i < tags.size(); i++) {

        temp = tags.get(i);

        if(!tags.get(i+1).equals(TagOperations.convertToCloseTag(tags.get(i)))){
            unclosedTags.add(tags.get(i));
            if(){

            }

        }else{
            return true;//well formed html
        }
    }

    return true;
}
4

1 に答える 1

0

2つの考え。まず最初に、HTMLでXMLパーサーを使用することで逃げることができますか?潜在的に簡単で、大幅に時間がかかりません。

私はこれについてあまり考えていませんが、私には再帰とスタックが進むべき道のように思えます。何かのようなもの

public myClass(String htmlInput)
{
    openedTags = new Stack<String>();
    this.htmlInput = htmlInput;
}
public boolean validate()
{
    return validate(this.htmlInput);
}
private boolean validate(String html)
{
    boolean result = true;
    String curTag;
    while(htmlLeft)        //worker loop
    {

        if(isOneOffTag(curTag))                 //matches <tags />
            continue;
        else if(isOpenTag(curTag))              //matches <tags>
        {
            openedTags.push(curTag);
            if(!validate(innerHtml))
                return false;
        }
        else if(isCloseTag(curTag))             //matches </tags>
        {
            String lastTag = (String)openedTags.peek();
            if(!tagIsSimiliar(curTag, lastTag))
                return false;
            openedTags.pop();
        }
    }


    return result;
}
private String nextTag(){return null;}
private boolean isOpenTag(String tag){ return true;}
private boolean isCloseTag(String tag){ return true;}
private boolean isOneOffTag(String tag){ return true;}
private boolean tagIsSimiliar(String curTag, String lastTag){return true;}

*編集1:おそらくスタックにプッシュする必要があります。

**編集2:ここでの問題は、ブール値のみを返すときに中断した場所を特定することだと思います。これには、中断した場所がわかるように、ある種のポインターが必要になります。私はまだうまくいくと信じていますが、そのアイデア。

于 2011-03-01T20:49:44.280 に答える