簡體   English   中英

將Jsoup與Java Reflection結合使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM