1

過去に jsoup を使用したことがありますが、jquery のようなセレクターがどのように定義されているのか理解できないようです。ソースコードを読みましたが、まだ理解できません。

public static final class ContainsOwnText extends Evaluator {
        private String searchText;

        public ContainsOwnText(String searchText) {
            this.searchText = searchText.toLowerCase();
        }

        @Override
        public boolean matches(Element root, Element element) {
            return (element.ownText().toLowerCase().contains(searchText));
        }

        @Override
        public String toString() {
            return String.format(":containsOwn(%s", searchText);
        }
    }

上記はこのように呼び出すことができます

select("*:containsOwn("+ str + ")");

セレクトはこちら

質問:

ContainsOwn がどのように機能するかを誰かに説明してもらえますか?


return String.format(":containsOwn(%s", searchText);

なぜ上記のようにならないのですか?

return String.format(":containsOwn(%s)", searchText);

そして評価者はこちら

jsoup がどのように機能するかを理解したいので質問していますが、機能させるのに問題があるわけではありません。私はそれがどのように行われたか知りたいだけです。jquery のようなセレクターでこの動作を再現し、同様のものを開発したい場合、どうすればよいですか?

4

1 に答える 1

2

そのクエリを呼び出すselect(query)と、エバリュエーターのセットを設定するために解析されます。エバリュエーターはコレクターに渡され、クエリを満たす要素のセットを構築します。

この場合、162 行目のQueryParsercontainsOwn操作により、contains325 行目のメソッドが呼び出され、ContainsOwnエバリュエーターのインスタンスが作成されます。

このエバリュエーターは、各エバリュエーターCollectorのメソッドを呼び出すツリーをトラバースする に渡されます。matchesこの場合 ( ContainsOwn)、matchesメソッドは のcontainsメソッドを使用してjava.lang.String、指定された文字列が要素自体のテキスト内に含まれているかどうかを確認します。

toStringメソッドは、ContainsOwnそれを作成するために使用される構文を反映するように記述されており、作成方法には影響しません (これは QueryParser によって処理されます)。閉じ括弧がないことは、無害なタイプミスのように見えます。

于 2013-07-08T11:07:15.983 に答える