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
方法。 在这种情况下(在ContainsOwn
) matches
方法使用java.lang.String
的contains
方法来检查给定的字符串是否包含在元素的自己的文本中。
ContainsOwn
的toString
方法已编写为镜像用于创建它的语法,并且不会影响它的创建方式(这由QueryParser处理)。 缺少一个封闭的括号看起来像一个无害的拼写错误。