Jsoup如何让jQuery像选择器一样?

我过去使用过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的选择器复制这种行为,并想开发类似的东西,我该怎么办?

当您调用select(query) ,将解析查询以填充一组赋值程序,然后将这些赋值程序传递给收集器以构造满足查询的一组元素。

在这种情况下,第162行的QueryParser containsOwn操作导致调用第325行的contains方法,这将创建ContainsOwn求值程序的实例。

此求值程序将传递给遍历树的Collector ,该树调用每个求值程序的matches方法。 在这种情况下(在ContainsOwnmatches方法使用java.lang.Stringcontains方法来检查给定的字符串是否包含在元素的自己的文本中。

ContainsOwntoString方法已编写为镜像用于创建它的语法,并且不会影响它的创建方式(这由QueryParser处理)。 缺少一个封闭的括号看起来像一个无害的拼写错误。