我过去使用过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 + ")");


Here is the select

问题:

有人可以向我解释ContainsOwn的工作原理吗?


  


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


为什么上面不是这样?

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


And here is the evaluator

我之所以问是因为我想了解jsoup的工作原理,不是我在使它工作时遇到麻烦。我只想知道它是如何完成的。如果我想用类似jquery的选择器来复制这种行为,并想开发类似的东西怎么办?

最佳答案

当您调用select(query)时,将对该查询进行解析以填充一组评估器,然后将这些评估器传递给Collector以构造满足该查询的一组元素。

在这种情况下,第162行的QueryParsercontainsOwn操作将导致第325行的contains方法被调用,这将创建ContainsOwn评估器的实例。

该评估器传递到遍历树的Collector,该树调用每个评估器的matches方法。在这种情况下(在ContainsOwn中),matches方法使用containsjava.lang.String方法检查给定的字符串是否包含在元素的自身文本中。

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

关于java - Jsoup如何使jQuery像选择器一样?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17335386/

10-12 02:37