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每个求值器的方法的 。在这种情况下(in ContainsOwn),该matches方法使用contains方法java.lang.String来检查给定的字符串是否包含在元素自己的文本中。

已编写 in 中的toString方法ContainsOwn以反映用于创建它的语法,并且对它的创建方式没有影响(这由 QueryParser 处理)。缺少右括号看起来像是一个无害的错字。

于 2013-07-08T11:07:15.983 回答