繁体   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