2013-06-27 40 views
1

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

Here is the select

問題:

能有人向我解釋了ContainsOwn是​​如何工作的?


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

上面爲什麼不是這樣?

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

And here is the evaluator

我這麼問是因爲我想了解jsoup是如何工作的,這不是我有麻煩使它工作。我只想知道它是如何完成的。如果我想用jquery-like選擇器來複制這種行爲,並想開發類似的東西,我應該怎麼做?

回答

2

當您調用select(query)解析查詢以填充一組評估程序,然後將其傳遞給收集程序以構建滿足查詢的一組元素。

在這種情況下對管線162中的QueryParsercontainsOwn操作導致在線路325中的contains方法被調用,它創建ContainsOwn評估器的一個實例。

這種評估被傳遞到遍歷樹,並調用每個評價者的matches方法Collector。在這種情況下(ContainsOwnmatches方法使用方法java.lang.String來檢查給定的字符串是否包含在元素的自己的文本中。

ContainsOwn中的toString方法已被寫入用於鏡像創建它的語法,並且它對創建方式沒有影響(QueryParser會處理這個方法)。缺少封閉的括號看起來像一個無害的錯字。

+0

Upvoted和accepted。謝謝。 – alkis

+0

我認爲賞金是通過接受而自動獲得的,但那會在一段時間後發生,而不是立即發生。也獲得賞金。 – alkis