2012-08-31 58 views
0

我想動態地在jsoup中調用一個方法。這裏是我的使用情況, 我其實調用jsoup多個選擇DOM方法橫向內部一樣,在Java反射中使用Jsoup

Document doc = Jsoup.connect("http://test.com").get(); 
String companyName = doc.select("div[class=\"_name\"]").select("span[class="\_name\"]").text(); 

我可以達到同樣的動態等,

Document doc = Jsoup.connect("http://test.com").get(); 
String pattern = "select("div[class=\"_name\"]").select("span[class="\_name\"]").text()"; 
String companyName = doc.pattern; 

我知道我們可以使用反射實現但不知道如何實現這種行爲,因爲模式字符串將是動態的,並可能有n個dom選擇器。

讓我知道如果上述的動力是可能的。

回答

1

是的,它是可能的,您只需重複調用Document對象上的select()方法,直到您枚舉了所有選擇器,並調用text()方法。

你甚至可以Concat的所有選擇在一個因爲select(div[class=foo]).select(span[class=bar]).text()相當於select(div[class=foo] span[class=bar]).text()可以簡化爲select(div.foo span.bar).text()

因此,也許你甚至可以放棄整個反射的事情,動態地創建一個正確的和直接選擇到你想。

Document doc = Jsoup.connect("http://test.com").get(); 
    String companyName = doc.select("div.foo span.bar").text(); 

這是使用鏈接:

Document doc = Jsoup.connect("http://test.com").get(); 
List<String> criterias = Arrays.asList("div.foo", "span.bar"); 
Document tmpDoc = doc; 
for (String criteria: criterias) { 
    if (tmpDoc != null) 
     tmpDoc = tmpDoc.select(criteria); 
} 
// now you have traversed the whole criterias just get the text 
String companyName = tmpDoc.text(); 

否則這是相同的使用反射:

Document doc = Jsoup.connect("http://test.com").get(); 
List<String> criterias = Arrays.asList("div.foo", "span.bar"); 
Method select = doc.getClass().getMethod("select", String.class); 
Document tmpDoc = doc; 
for (String criteria: criterias) { 
    if (tmpDoc != null) 
     tmpDoc = (Document)select.invoke(tmpDoc, new Object[] {criteria}); 
} 
// now you have traversed the whole criterias just get the text 
String companyName = tmpDoc.text(); 
+0

我想你應該張貼for-each循環的代碼了,但沒有反射。你可以通過在'tmpDoc'上反覆調用'select'而不用反射來鏈接所有的選擇。反思在這裏肯定是錯誤的答案。 – DaoWen

+1

是的,我知道,這就是我剛纔所說的,我發佈了反思代碼,所以他知道他如何處理它。謝謝。 – Alex

+0

非常好!我同意發佈反射代碼是很好的,因爲他特別詢問了反射,但我很高興你發佈了非反射版本,所以他可以看到沒有更好的反射代碼。 – DaoWen

0

如果你想要的是支持DOM選擇的n個那麼你並不真正需要思考,因爲你可以撰寫他們在一個單一的選擇符:

Document doc = Jsoup.connect("http://test.com").get(); 
String pattern = "div[class=\"_name\"] span[class=\"_name\"]"; // Just separate with spaces 
String companyName = doc.select(pattern).text();