[英]Using Jsoup with Java Reflection
我想動態調用jsoup中的方法。 這是我的用例,實際上我在jsoup中調用多個select dom方法來遍歷內部,例如
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選擇器。
讓我知道上述動力是否可行。
是的,有可能,您要做的就是重復調用Document對象上的select()
方法,直到枚舉了所有選擇器,然后再調用text()
方法。
您甚至可以合並所有選擇器,因為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();
如果您只想支持n個dom選擇器,那么您實際上就不需要反射,因為您可以將它們組合在單個選擇器字符串中:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.